< 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 >