998 999 void os::WatcherThreadCrashProtection::restore() { 1000 assert(WatcherThread::watcher_thread()->has_crash_protection(), 1001 "must have crash protection"); 1002 1003 siglongjmp(_jmpbuf, 1); 1004 } 1005 1006 void os::WatcherThreadCrashProtection::check_crash_protection(int sig, 1007 Thread* thread) { 1008 1009 if (thread != NULL && 1010 thread->is_Watcher_thread() && 1011 WatcherThread::watcher_thread()->has_crash_protection()) { 1012 1013 if (sig == SIGSEGV || sig == SIGBUS) { 1014 WatcherThread::watcher_thread()->crash_protection()->restore(); 1015 } 1016 } 1017 } | 998 999 void os::WatcherThreadCrashProtection::restore() { 1000 assert(WatcherThread::watcher_thread()->has_crash_protection(), 1001 "must have crash protection"); 1002 1003 siglongjmp(_jmpbuf, 1); 1004 } 1005 1006 void os::WatcherThreadCrashProtection::check_crash_protection(int sig, 1007 Thread* thread) { 1008 1009 if (thread != NULL && 1010 thread->is_Watcher_thread() && 1011 WatcherThread::watcher_thread()->has_crash_protection()) { 1012 1013 if (sig == SIGSEGV || sig == SIGBUS) { 1014 WatcherThread::watcher_thread()->crash_protection()->restore(); 1015 } 1016 } 1017 } 1018 1019 #define assert_with_errno(cond, msg) \ 1020 do { \ 1021 int err = errno; \ 1022 assert(cond, err_msg("%s; error='%s' (errno=%d)", msg, strerror(err), err)); \ 1023 } while (false) 1024 1025 // POSIX unamed semaphores are not supported on OS X. 1026 #ifndef __APPLE__ 1027 1028 Semaphore::Semaphore(uint value, uint /* max */) { 1029 int ret = sem_init(&_semaphore, 0, value); 1030 1031 assert_with_errno(ret == 0, "Failed to initialize semaphore"); 1032 } 1033 1034 Semaphore::~Semaphore() { 1035 sem_destroy(&_semaphore); 1036 } 1037 1038 void Semaphore::signal() { 1039 int ret = sem_post(&_semaphore); 1040 1041 assert_with_errno(ret == 0, "sem_post failed"); 1042 } 1043 1044 void Semaphore::signal(uint count) { 1045 for (uint i = 0; i < count; i++) { 1046 signal(); 1047 } 1048 } 1049 1050 void Semaphore::wait() { 1051 while (sem_wait(&_semaphore) == -1 && errno == EINTR) { 1052 // Retry if the wait was interrupted by a signal. 1053 } 1054 } 1055 1056 bool os::PosixSemaphore::trywait() { 1057 return sem_trywait(&_semaphore) == 0; 1058 } 1059 1060 bool os::PosixSemaphore::timedwait(const struct timespec ts) { 1061 while (1) { 1062 int result = sem_timedwait(&_semaphore, &ts); 1063 if (result == 0) { 1064 return true; 1065 } else if (errno == EINTR) { 1066 continue; 1067 } else if (errno == ETIMEDOUT) { 1068 return false; 1069 } else { 1070 return false; 1071 } 1072 } 1073 } 1074 1075 #endif // __APPLE__ |