< prev index next >

src/os/solaris/vm/os_solaris.cpp

Print this page

        

@@ -65,10 +65,11 @@
 #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 <dlfcn.h>
 # include <errno.h>

@@ -2264,37 +2265,49 @@
 
 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:
-  sema_t _semaphore;
-};
+static int sem_max_value = -1;
 
+Semaphore::Semaphore(uint value, uint max) {
+  guarantee(value <= max, "value lower than max");
 
-Semaphore::Semaphore() {
-  sema_init(&_semaphore, 0, NULL, NULL);
+  static long sem_value_max = sysconf(_SC_SEM_VALUE_MAX);
+  guarantee(max == Semaphore::NoMaxCount || value <= sem_max_value,
+      err_msg("Max value: %u set higher than SEM_VALUE_MAX: %l", sem_value_max));
+
+  int ret = sema_init(&_semaphore, value, NULL, NULL);
+
+  guarantee(ret == 0, "Failed to initialize semaphore");
 }
 
 Semaphore::~Semaphore() {
   sema_destroy(&_semaphore);
 }
 
 void Semaphore::signal() {
-  sema_post(&_semaphore);
+  int ret = sema_post(&_semaphore);
+
+  assert(ret == 0, err_msg("Semaphore signal failed: %d", errno));
+}
+
+void Semaphore::signal(uint count) {
+  for (uint i = 0; i < count; i++) {
+    signal();
+  }
 }
 
 void Semaphore::wait() {
-  sema_wait(&_semaphore);
+  int ret;
+
+  do {
+    ret = sema_wait(&_semaphore);
+    // Retry if the wait was interrupted by a signal.
+  } while (errno == EINTR);
+
+  assert(ret == 0, err_msg("Semaphore wait failed: %d", errno));
 }
 
 bool Semaphore::trywait() {
   return sema_trywait(&_semaphore) == 0;
 }
< prev index next >