< prev index next >

src/os/bsd/vm/os_bsd.cpp

Print this page

        

*** 64,73 **** --- 64,74 ---- #include "services/runtimeService.hpp" #include "utilities/decoder.hpp" #include "utilities/defaultStream.hpp" #include "utilities/events.hpp" #include "utilities/growableArray.hpp" + #include "utilities/semaphore.hpp" #include "utilities/vmError.hpp" // put OS-includes here # include <sys/types.h> # include <sys/mman.h>
*** 1939,2004 **** // a counter for each possible signal value static volatile jint pending_signals[NSIG+1] = { 0 }; // Bsd(POSIX) specific hand shaking semaphore. #ifdef __APPLE__ - typedef semaphore_t os_semaphore_t; - #define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value) #define SEM_WAIT(sem) semaphore_wait(sem) #define SEM_POST(sem) semaphore_signal(sem) #define SEM_DESTROY(sem) semaphore_destroy(mach_task_self(), sem) #else - typedef sem_t os_semaphore_t; - #define SEM_INIT(sem, value) sem_init(&sem, 0, value) #define SEM_WAIT(sem) sem_wait(&sem) #define SEM_POST(sem) sem_post(&sem) #define SEM_DESTROY(sem) sem_destroy(&sem) #endif ! class Semaphore : public StackObj { ! public: ! Semaphore(); ! ~Semaphore(); ! void signal(); ! void wait(); ! bool trywait(); ! bool timedwait(unsigned int sec, int nsec); ! private: ! jlong currenttime() const; ! os_semaphore_t _semaphore; ! }; ! Semaphore::Semaphore() : _semaphore(0) { ! SEM_INIT(_semaphore, 0); } Semaphore::~Semaphore() { SEM_DESTROY(_semaphore); } void Semaphore::signal() { SEM_POST(_semaphore); } void Semaphore::wait() { ! SEM_WAIT(_semaphore); } ! jlong Semaphore::currenttime() const { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000); ! } ! #ifdef __APPLE__ ! bool Semaphore::trywait() { return timedwait(0, 0); ! } ! bool Semaphore::timedwait(unsigned int sec, int nsec) { kern_return_t kr = KERN_ABORTED; mach_timespec_t waitspec; waitspec.tv_sec = sec; waitspec.tv_nsec = nsec; --- 1940,2003 ---- // a counter for each possible signal value static volatile jint pending_signals[NSIG+1] = { 0 }; // Bsd(POSIX) specific hand shaking semaphore. #ifdef __APPLE__ #define SEM_INIT(sem, value) semaphore_create(mach_task_self(), &sem, SYNC_POLICY_FIFO, value) #define SEM_WAIT(sem) semaphore_wait(sem) #define SEM_POST(sem) semaphore_signal(sem) #define SEM_DESTROY(sem) semaphore_destroy(mach_task_self(), sem) #else #define SEM_INIT(sem, value) sem_init(&sem, 0, value) #define SEM_WAIT(sem) sem_wait(&sem) #define SEM_POST(sem) sem_post(&sem) #define SEM_DESTROY(sem) sem_destroy(&sem) #endif ! #ifdef __APPLE__ ! // OS X doesn't support unamed POSIX semaphores, so the implementation in os_posix.cpp can't be used. ! Semaphore::Semaphore(uint value) : _semaphore(0) { ! SEM_INIT(_semaphore, value); } Semaphore::~Semaphore() { SEM_DESTROY(_semaphore); } void Semaphore::signal() { SEM_POST(_semaphore); } + void Semaphore::signal(uint count) { + for (uint i = 0; i < count; i++) { + signal(); + } + } + void Semaphore::wait() { ! while (SEM_WAIT(_semaphore) == KERN_ABORTED) { ! // Semaphore was interrupted. Retry. ! } } ! class BsdSemaphore : public Semaphore { ! private: ! static jlong currenttime() { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000); ! } ! public: ! BsdSemaphore(uint value = 0) : Semaphore(value) {} ! ! bool trywait() { return timedwait(0, 0); ! } ! bool timedwait(unsigned int sec, int nsec) { kern_return_t kr = KERN_ABORTED; mach_timespec_t waitspec; waitspec.tv_sec = sec; waitspec.tv_nsec = nsec;
*** 2022,2061 **** kr = semaphore_timedwait(_semaphore, waitspec); } return kr == KERN_SUCCESS; ! } #else ! bool Semaphore::trywait() { ! return sem_trywait(&_semaphore) == 0; ! } ! bool Semaphore::timedwait(unsigned int sec, int nsec) { struct timespec ts; unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec); ! 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__ static os_semaphore_t sig_sem; ! static Semaphore sr_semaphore; void os::signal_init_pd() { // Initialize signal structures ::memset((void*)pending_signals, 0, sizeof(pending_signals)); --- 2021,2051 ---- kr = semaphore_timedwait(_semaphore, waitspec); } return kr == KERN_SUCCESS; ! } ! }; #else ! class BsdSemaphore : public os::PosixSemaphore { ! public: ! BsdSemaphore(uint value = 0) : os::PosixSemaphore(value) {} ! bool BsdSemaphore::timedwait(unsigned int sec, int nsec) { struct timespec ts; unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec); ! return os::PosixSemaphore::timedwait(ts); } ! }; #endif // __APPLE__ static os_semaphore_t sig_sem; ! static BsdSemaphore sr_semaphore; void os::signal_init_pd() { // Initialize signal structures ::memset((void*)pending_signals, 0, sizeof(pending_signals));
< prev index next >