< prev index next >

src/os/bsd/vm/os_bsd.cpp

Print this page

        

*** 57,66 **** --- 57,67 ---- #include "runtime/statSampler.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.inline.hpp" #include "runtime/threadCritical.hpp" #include "runtime/timer.hpp" + #include "semaphore_bsd.hpp" #include "services/attachListener.hpp" #include "services/memTracker.hpp" #include "services/runtimeService.hpp" #include "utilities/decoder.hpp" #include "utilities/defaultStream.hpp"
*** 1954,2004 **** #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; --- 1955,2012 ---- #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. ! ! static const char* sem_init_strerror(kern_return_t value) { ! switch (value) { ! case KERN_INVALID_ARGUMENT: return "Invalid argument"; ! case KERN_RESOURCE_SHORTAGE: return "Resource shortage"; ! default: return "Unknown"; ! } ! } ! ! OSXSemaphore::OSXSemaphore(uint value) : _semaphore(0) { ! kern_return_t ret = SEM_INIT(_semaphore, value); ! guarantee(ret == KERN_SUCCESS, err_msg("Failed to create semaphore: %s", sem_init_strerror(ret))); } ! OSXSemaphore::~OSXSemaphore() { SEM_DESTROY(_semaphore); } ! void OSXSemaphore::signal(uint count) { ! for (uint i = 0; i < count; i++) { ! kern_return_t ret = SEM_POST(_semaphore); ! ! assert(ret == KERN_SUCCESS, "Failed to signal semaphore"); ! } } ! void OSXSemaphore::wait() { ! kern_return_t ret; ! while ((ret = SEM_WAIT(_semaphore)) == KERN_ABORTED) { ! // Semaphore was interrupted. Retry. ! } ! assert(ret == KERN_SUCCESS, "Failed to wait on semaphore"); } ! jlong OSXSemaphore::currenttime() { struct timeval tv; gettimeofday(&tv, NULL); return (tv.tv_sec * NANOSECS_PER_SEC) + (tv.tv_usec * 1000); } ! bool OSXSemaphore::trywait() { return timedwait(0, 0); } ! bool OSXSemaphore::timedwait(unsigned int sec, int nsec) { kern_return_t kr = KERN_ABORTED; mach_timespec_t waitspec; waitspec.tv_sec = sec; waitspec.tv_nsec = nsec;
*** 2025,2061 **** 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)); --- 2033,2060 ---- return kr == KERN_SUCCESS; } #else + // Use POSIX implementation of semaphores. ! struct timespec PosixSemaphore::create_timespec(unsigned int sec, int nsec) { struct timespec ts; unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec); ! return ts; } #endif // __APPLE__ static os_semaphore_t sig_sem; ! ! #ifdef __APPLE__ ! static OSXSemaphore sr_semaphore; ! #else ! static PosixSemaphore sr_semaphore; ! #endif void os::signal_init_pd() { // Initialize signal structures ::memset((void*)pending_signals, 0, sizeof(pending_signals));
< prev index next >