< prev index next >

src/os/posix/vm/os_posix.cpp

Print this page

        

*** 1013,1017 **** --- 1013,1075 ---- if (sig == SIGSEGV || sig == SIGBUS) { WatcherThread::watcher_thread()->crash_protection()->restore(); } } } + + #define assert_with_errno(cond, msg) \ + do { \ + int err = errno; \ + assert(cond, err_msg("%s; error='%s' (errno=%d)", msg, strerror(err), err)); \ + } while (false) + + // POSIX unamed semaphores are not supported on OS X. + #ifndef __APPLE__ + + Semaphore::Semaphore(uint value) { + int ret = sem_init(&_semaphore, 0, value); + + assert_with_errno(ret == 0, "Failed to initialize semaphore"); + } + + Semaphore::~Semaphore() { + sem_destroy(&_semaphore); + } + + void Semaphore::signal() { + int ret = sem_post(&_semaphore); + + assert_with_errno(ret == 0, "sem_post failed"); + } + + void Semaphore::signal(uint count) { + for (uint i = 0; i < count; i++) { + signal(); + } + } + + void Semaphore::wait() { + while (sem_wait(&_semaphore) == -1 && errno == EINTR) { + // Retry if the wait was interrupted by a signal. + } + } + + bool os::PosixSemaphore::trywait() { + return sem_trywait(&_semaphore) == 0; + } + + bool os::PosixSemaphore::timedwait(const struct timespec ts) { + while (1) { + int result = sem_timedwait(&_semaphore, &ts); + if (result == 0) { + return true; + } else if (errno == EINTR) { + continue; + } else if (errno == ETIMEDOUT) { + return false; + } else { + return false; + } + } + } + + #endif // __APPLE__
< prev index next >