mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
8210832: Remove sneaky locking in class Monitor
Removed sneaky locking and simplified vm monitors implementation Co-authored-by: David Holmes <david.holmes@oracle.com> Reviewed-by: rehn, dcubed, pliden, dholmes, coleenp
This commit is contained in:
parent
cd9b1aabb0
commit
c94cdddbdd
17 changed files with 509 additions and 1157 deletions
|
@ -5192,6 +5192,72 @@ void Parker::unpark() {
|
|||
}
|
||||
}
|
||||
|
||||
// Platform Monitor implementation
|
||||
|
||||
os::PlatformMonitor::PlatformMonitor() {
|
||||
int status = os::Solaris::cond_init(&_cond);
|
||||
assert_status(status == 0, status, "cond_init");
|
||||
status = os::Solaris::mutex_init(&_mutex);
|
||||
assert_status(status == 0, status, "mutex_init");
|
||||
}
|
||||
|
||||
os::PlatformMonitor::~PlatformMonitor() {
|
||||
int status = os::Solaris::cond_destroy(&_cond);
|
||||
assert_status(status == 0, status, "cond_destroy");
|
||||
status = os::Solaris::mutex_destroy(&_mutex);
|
||||
assert_status(status == 0, status, "mutex_destroy");
|
||||
}
|
||||
|
||||
void os::PlatformMonitor::lock() {
|
||||
int status = os::Solaris::mutex_lock(&_mutex);
|
||||
assert_status(status == 0, status, "mutex_lock");
|
||||
}
|
||||
|
||||
void os::PlatformMonitor::unlock() {
|
||||
int status = os::Solaris::mutex_unlock(&_mutex);
|
||||
assert_status(status == 0, status, "mutex_unlock");
|
||||
}
|
||||
|
||||
bool os::PlatformMonitor::try_lock() {
|
||||
int status = os::Solaris::mutex_trylock(&_mutex);
|
||||
assert_status(status == 0 || status == EBUSY, status, "mutex_trylock");
|
||||
return status == 0;
|
||||
}
|
||||
|
||||
// Must already be locked
|
||||
int os::PlatformMonitor::wait(jlong millis) {
|
||||
assert(millis >= 0, "negative timeout");
|
||||
if (millis > 0) {
|
||||
timestruc_t abst;
|
||||
int ret = OS_TIMEOUT;
|
||||
compute_abstime(&abst, millis);
|
||||
int status = os::Solaris::cond_timedwait(&_cond, &_mutex, &abst);
|
||||
assert_status(status == 0 || status == EINTR ||
|
||||
status == ETIME || status == ETIMEDOUT,
|
||||
status, "cond_timedwait");
|
||||
// EINTR acts as spurious wakeup - which is permitted anyway
|
||||
if (status == 0 || status == EINTR) {
|
||||
ret = OS_OK;
|
||||
}
|
||||
return ret;
|
||||
} else {
|
||||
int status = os::Solaris::cond_wait(&_cond, &_mutex);
|
||||
assert_status(status == 0 || status == EINTR,
|
||||
status, "cond_wait");
|
||||
return OS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
void os::PlatformMonitor::notify() {
|
||||
int status = os::Solaris::cond_signal(&_cond);
|
||||
assert_status(status == 0, status, "cond_signal");
|
||||
}
|
||||
|
||||
void os::PlatformMonitor::notify_all() {
|
||||
int status = os::Solaris::cond_broadcast(&_cond);
|
||||
assert_status(status == 0, status, "cond_broadcast");
|
||||
}
|
||||
|
||||
extern char** environ;
|
||||
|
||||
// Run the specified command in a separate process. Return its exit value,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue