< prev index next >

src/os/linux/vm/os_linux.cpp

Print this page

        

*** 2391,2434 **** void* os::user_handler() { return CAST_FROM_FN_PTR(void*, UserHandler); } ! class Semaphore : public StackObj { public: ! Semaphore(); ! ~Semaphore(); ! void signal(); ! void wait(); ! bool trywait(); ! bool timedwait(unsigned int sec, int nsec); ! private: ! sem_t _semaphore; ! }; ! ! Semaphore::Semaphore() { ! sem_init(&_semaphore, 0, 0); ! } ! ! Semaphore::~Semaphore() { ! sem_destroy(&_semaphore); ! } ! ! void Semaphore::signal() { ! sem_post(&_semaphore); ! } ! ! void Semaphore::wait() { ! sem_wait(&_semaphore); ! } ! ! bool Semaphore::trywait() { ! return sem_trywait(&_semaphore) == 0; ! } ! ! bool Semaphore::timedwait(unsigned int sec, int nsec) { struct timespec ts; // Semaphore's are always associated with CLOCK_REALTIME os::Linux::clock_gettime(CLOCK_REALTIME, &ts); // see unpackTime for discussion on overflow checking if (sec >= MAX_SECS) { --- 2391,2405 ---- void* os::user_handler() { return CAST_FROM_FN_PTR(void*, UserHandler); } ! class LinuxSemaphore : public os::PosixSemaphore { public: ! LinuxSemaphore(uint value = 0) : os::PosixSemaphore(value) {} + bool timedwait(unsigned int sec, int nsec) { struct timespec ts; // Semaphore's are always associated with CLOCK_REALTIME os::Linux::clock_gettime(CLOCK_REALTIME, &ts); // see unpackTime for discussion on overflow checking if (sec >= MAX_SECS) {
*** 2441,2463 **** ts.tv_nsec -= NANOSECS_PER_SEC; ++ts.tv_sec; // note: this must be <= max_secs } } ! 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; ! } } ! } extern "C" { typedef void (*sa_handler_t)(int); typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); } --- 2412,2424 ---- ts.tv_nsec -= NANOSECS_PER_SEC; ++ts.tv_sec; // note: this must be <= max_secs } } ! return os::PosixSemaphore::timedwait(ts); } ! }; extern "C" { typedef void (*sa_handler_t)(int); typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); }
*** 2492,2502 **** // a counter for each possible signal value static volatile jint pending_signals[NSIG+1] = { 0 }; // Linux(POSIX) specific hand shaking semaphore. static sem_t sig_sem; ! static Semaphore sr_semaphore; void os::signal_init_pd() { // Initialize signal structures ::memset((void*)pending_signals, 0, sizeof(pending_signals)); --- 2453,2463 ---- // a counter for each possible signal value static volatile jint pending_signals[NSIG+1] = { 0 }; // Linux(POSIX) specific hand shaking semaphore. static sem_t sig_sem; ! static LinuxSemaphore sr_semaphore; void os::signal_init_pd() { // Initialize signal structures ::memset((void*)pending_signals, 0, sizeof(pending_signals));
< prev index next >