< prev index next >
src/hotspot/os/solaris/os_solaris.cpp
Print this page
*** 2060,2070 ****
void* os::user_handler() {
return CAST_FROM_FN_PTR(void*, UserHandler);
}
! struct timespec PosixSemaphore::create_timespec(unsigned int sec, int nsec) {
struct timespec ts;
unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
return ts;
}
--- 2060,2070 ----
void* os::user_handler() {
return CAST_FROM_FN_PTR(void*, UserHandler);
}
! static struct timespec create_timespec(unsigned int sec, int nsec) {
struct timespec ts;
unpackTime(&ts, false, (sec * NANOSECS_PER_SEC) + nsec);
return ts;
}
*** 2098,2108 ****
// a counter for each possible signal value
static int Sigexit = 0;
static jint *pending_signals = NULL;
static int *preinstalled_sigs = NULL;
static struct sigaction *chainedsigactions = NULL;
! static sema_t sig_sem;
typedef int (*version_getting_t)();
version_getting_t os::Solaris::get_libjsig_version = NULL;
int os::sigexitnum_pd() {
assert(Sigexit > 0, "signal memory not yet initialized");
--- 2098,2108 ----
// a counter for each possible signal value
static int Sigexit = 0;
static jint *pending_signals = NULL;
static int *preinstalled_sigs = NULL;
static struct sigaction *chainedsigactions = NULL;
! static Semaphore* sig_sem = NULL;
typedef int (*version_getting_t)();
version_getting_t os::Solaris::get_libjsig_version = NULL;
int os::sigexitnum_pd() {
assert(Sigexit > 0, "signal memory not yet initialized");
*** 2113,2122 ****
--- 2113,2123 ----
// Initialize signal structures
Maxsignum = SIGRTMAX;
Sigexit = Maxsignum+1;
assert(Maxsignum >0, "Unable to obtain max signal number");
+ // Initialize signal structures
// pending_signals has one int per signal
// The additional signal is for SIGEXIT - exit signal to signal_thread
pending_signals = (jint *)os::malloc(sizeof(jint) * (Sigexit+1), mtInternal);
memset(pending_signals, 0, (sizeof(jint) * (Sigexit+1)));
*** 2130,2151 ****
ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
}
void os::signal_init_pd() {
! int ret;
!
! ret = ::sema_init(&sig_sem, 0, NULL, NULL);
! assert(ret == 0, "sema_init() failed");
}
! void os::signal_notify(int signal_number) {
! int ret;
!
! Atomic::inc(&pending_signals[signal_number]);
! ret = ::sema_post(&sig_sem);
! assert(ret == 0, "sema_post() failed");
}
static int check_pending_signals(bool wait_for_signal) {
int ret;
while (true) {
--- 2131,2153 ----
ourSigFlags = (int*)malloc(sizeof(int) * (Maxsignum + 1), mtInternal);
memset(ourSigFlags, 0, sizeof(int) * (Maxsignum + 1));
}
void os::signal_init_pd() {
! // Initialize signal semaphore
! sig_sem = new Semaphore();
}
! void os::signal_notify(int sig) {
! if (sig_sem != NULL) {
! Atomic::inc(&pending_signals[sig]);
! sig_sem->signal();
! } else {
! // Signal thread is not created with ReduceSignalUsage and signal_init_pd
! // initialization isn't called.
! assert(ReduceSignalUsage, "signal semaphore should be created");
! }
}
static int check_pending_signals(bool wait_for_signal) {
int ret;
while (true) {
*** 2162,2196 ****
ThreadBlockInVM tbivm(thread);
bool threadIsSuspended;
do {
thread->set_suspend_equivalent();
! // cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
! while ((ret = ::sema_wait(&sig_sem)) == EINTR)
! ;
! assert(ret == 0, "sema_wait() failed");
// were we externally suspended while we were waiting?
threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
if (threadIsSuspended) {
// The semaphore has been incremented, but while we were waiting
// another thread suspended us. We don't want to continue running
// while suspended because that would surprise the thread that
// suspended us.
! ret = ::sema_post(&sig_sem);
! assert(ret == 0, "sema_post() failed");
thread->java_suspend_self();
}
} while (threadIsSuspended);
}
}
- int os::signal_lookup() {
- return check_pending_signals(false);
- }
-
int os::signal_wait() {
return check_pending_signals(true);
}
////////////////////////////////////////////////////////////////////////////////
--- 2164,2190 ----
ThreadBlockInVM tbivm(thread);
bool threadIsSuspended;
do {
thread->set_suspend_equivalent();
! sig_sem->wait();
// were we externally suspended while we were waiting?
threadIsSuspended = thread->handle_special_suspend_equivalent_condition();
if (threadIsSuspended) {
// The semaphore has been incremented, but while we were waiting
// another thread suspended us. We don't want to continue running
// while suspended because that would surprise the thread that
// suspended us.
! sig_sem->signal();
thread->java_suspend_self();
}
} while (threadIsSuspended);
}
}
int os::signal_wait() {
return check_pending_signals(true);
}
////////////////////////////////////////////////////////////////////////////////
*** 3597,3607 ****
ShouldNotReachHere();
}
// managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
while (true) {
! if (sr_semaphore.timedwait(0, 2000 * NANOSECS_PER_MILLISEC)) {
break;
} else {
// timeout
os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
if (cancelled == os::SuspendResume::SR_RUNNING) {
--- 3591,3601 ----
ShouldNotReachHere();
}
// managed to send the signal and switch to SUSPEND_REQUEST, now wait for SUSPENDED
while (true) {
! if (sr_semaphore.timedwait(create_timespec(0, 2000 * NANOSECS_PER_MILLISEC))) {
break;
} else {
// timeout
os::SuspendResume::State cancelled = osthread->sr.cancel_suspend();
if (cancelled == os::SuspendResume::SR_RUNNING) {
*** 3631,3641 ****
return;
}
while (true) {
if (sr_notify(osthread) == 0) {
! if (sr_semaphore.timedwait(0, 2 * NANOSECS_PER_MILLISEC)) {
if (osthread->sr.is_running()) {
return;
}
}
} else {
--- 3625,3635 ----
return;
}
while (true) {
if (sr_notify(osthread) == 0) {
! if (sr_semaphore.timedwait(create_timespec(0, 2 * NANOSECS_PER_MILLISEC))) {
if (osthread->sr.is_running()) {
return;
}
}
} else {
< prev index next >