comparison src/os/posix/vm/os_posix.cpp @ 11198:1e6d5dec4a4e

Merge.
author Christian Humer <christian.humer@gmail.com>
date Mon, 05 Aug 2013 13:20:06 +0200
parents 5e3b6f79d280
children f92b82d454fa cc56f122f3f7 f42f2e2a1518
comparison
equal deleted inserted replaced
11197:3479ab380552 11198:1e6d5dec4a4e
257 } 257 }
258 258
259 FILE* os::open(int fd, const char* mode) { 259 FILE* os::open(int fd, const char* mode) {
260 return ::fdopen(fd, mode); 260 return ::fdopen(fd, mode);
261 } 261 }
262
263 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() {
264 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread");
265 }
266
267 /*
268 * See the caveats for this class in os_posix.hpp
269 * Protects the callback call so that SIGSEGV / SIGBUS jumps back into this
270 * method and returns false. If none of the signals are raised, returns true.
271 * The callback is supposed to provide the method that should be protected.
272 */
273 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
274 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
275 assert(!WatcherThread::watcher_thread()->has_crash_protection(),
276 "crash_protection already set?");
277
278 if (sigsetjmp(_jmpbuf, 1) == 0) {
279 // make sure we can see in the signal handler that we have crash protection
280 // installed
281 WatcherThread::watcher_thread()->set_crash_protection(this);
282 cb.call();
283 // and clear the crash protection
284 WatcherThread::watcher_thread()->set_crash_protection(NULL);
285 return true;
286 }
287 // this happens when we siglongjmp() back
288 WatcherThread::watcher_thread()->set_crash_protection(NULL);
289 return false;
290 }
291
292 void os::WatcherThreadCrashProtection::restore() {
293 assert(WatcherThread::watcher_thread()->has_crash_protection(),
294 "must have crash protection");
295
296 siglongjmp(_jmpbuf, 1);
297 }
298
299 void os::WatcherThreadCrashProtection::check_crash_protection(int sig,
300 Thread* thread) {
301
302 if (thread != NULL &&
303 thread->is_Watcher_thread() &&
304 WatcherThread::watcher_thread()->has_crash_protection()) {
305
306 if (sig == SIGSEGV || sig == SIGBUS) {
307 WatcherThread::watcher_thread()->crash_protection()->restore();
308 }
309 }
310 }