< prev index next >
src/os/solaris/vm/os_solaris.cpp
Print this page
@@ -2264,60 +2264,21 @@
void* os::user_handler() {
return CAST_FROM_FN_PTR(void*, UserHandler);
}
-class Semaphore : public StackObj {
+class SolarisSemaphore : public os::PosixSemaphore {
public:
- Semaphore();
- ~Semaphore();
- void signal();
- void wait();
- bool trywait();
- bool timedwait(unsigned int sec, int nsec);
- private:
- sema_t _semaphore;
-};
-
-
-Semaphore::Semaphore() {
- sema_init(&_semaphore, 0, NULL, NULL);
-}
-
-Semaphore::~Semaphore() {
- sema_destroy(&_semaphore);
-}
-
-void Semaphore::signal() {
- sema_post(&_semaphore);
-}
-
-void Semaphore::wait() {
- sema_wait(&_semaphore);
-}
+ SolarisSemaphore(uint value = 0) : os::PosixSemaphore(value) {}
-bool Semaphore::trywait() {
- return sema_trywait(&_semaphore) == 0;
-}
-
-bool Semaphore::timedwait(unsigned int sec, int nsec) {
+ bool timedwait(unsigned int sec, int nsec) {
struct timespec ts;
unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
- while (1) {
- int result = sema_timedwait(&_semaphore, &ts);
- if (result == 0) {
- return true;
- } else if (errno == EINTR) {
- continue;
- } else if (errno == ETIME) {
- return false;
- } else {
- return false;
- }
+ return os::PosixSemaphore::timedwait(ts);
}
-}
+};
extern "C" {
typedef void (*sa_handler_t)(int);
typedef void (*sa_sigaction_t)(int, siginfo_t *, void *);
}
@@ -3712,11 +3673,11 @@
static void suspend_save_context(OSThread *osthread, ucontext_t* context) {
osthread->set_ucontext(context);
}
-static Semaphore sr_semaphore;
+static SolarisSemaphore sr_semaphore;
void os::Solaris::SR_handler(Thread* thread, ucontext_t* uc) {
// Save and restore errno to avoid confusing native code with EINTR
// after sigsuspend.
int old_errno = errno;
< prev index next >