hotspot/src/os/posix/vm/os_posix.cpp
changeset 19691 5116fb76692a
parent 18943 7d0ef675e808
child 19697 d55ba95422d7
equal deleted inserted replaced
19690:3c0c996f4df5 19691:5116fb76692a
     1 /*
     1 /*
     2 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
     2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
     3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4 *
     4 *
     5 * This code is free software; you can redistribute it and/or modify it
     5 * This code is free software; you can redistribute it and/or modify it
     6 * under the terms of the GNU General Public License version 2 only, as
     6 * under the terms of the GNU General Public License version 2 only, as
     7 * published by the Free Software Foundation.
     7 * published by the Free Software Foundation.
    28 #include "utilities/vmError.hpp"
    28 #include "utilities/vmError.hpp"
    29 
    29 
    30 #include <unistd.h>
    30 #include <unistd.h>
    31 #include <sys/resource.h>
    31 #include <sys/resource.h>
    32 #include <sys/utsname.h>
    32 #include <sys/utsname.h>
       
    33 #include <pthread.h>
       
    34 #include <signal.h>
    33 
    35 
    34 
    36 
    35 // Check core dump limit and report possible place where core can be found
    37 // Check core dump limit and report possible place where core can be found
    36 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
    38 void os::check_or_create_dump(void* exceptionRecord, void* contextRecord, char* buffer, size_t bufferSize) {
    37   int n;
    39   int n;
   269  * Protects the callback call so that SIGSEGV / SIGBUS jumps back into this
   271  * 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.
   272  * 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.
   273  * The callback is supposed to provide the method that should be protected.
   272  */
   274  */
   273 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
   275 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) {
       
   276   sigset_t saved_sig_mask;
       
   277 
   274   assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
   278   assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread");
   275   assert(!WatcherThread::watcher_thread()->has_crash_protection(),
   279   assert(!WatcherThread::watcher_thread()->has_crash_protection(),
   276       "crash_protection already set?");
   280       "crash_protection already set?");
   277 
   281 
   278   if (sigsetjmp(_jmpbuf, 1) == 0) {
   282   // we cannot rely on sigsetjmp/siglongjmp to save/restore the signal mask
       
   283   // since on at least some systems (OS X) siglongjmp will restore the mask
       
   284   // for the process, not the thread
       
   285   pthread_sigmask(0, NULL, &saved_sig_mask);
       
   286   if (sigsetjmp(_jmpbuf, 0) == 0) {
   279     // make sure we can see in the signal handler that we have crash protection
   287     // make sure we can see in the signal handler that we have crash protection
   280     // installed
   288     // installed
   281     WatcherThread::watcher_thread()->set_crash_protection(this);
   289     WatcherThread::watcher_thread()->set_crash_protection(this);
   282     cb.call();
   290     cb.call();
   283     // and clear the crash protection
   291     // and clear the crash protection
   284     WatcherThread::watcher_thread()->set_crash_protection(NULL);
   292     WatcherThread::watcher_thread()->set_crash_protection(NULL);
   285     return true;
   293     return true;
   286   }
   294   }
   287   // this happens when we siglongjmp() back
   295   // this happens when we siglongjmp() back
       
   296   pthread_sigmask(SIG_SETMASK, &saved_sig_mask, NULL);
   288   WatcherThread::watcher_thread()->set_crash_protection(NULL);
   297   WatcherThread::watcher_thread()->set_crash_protection(NULL);
   289   return false;
   298   return false;
   290 }
   299 }
   291 
   300 
   292 void os::WatcherThreadCrashProtection::restore() {
   301 void os::WatcherThreadCrashProtection::restore() {