6822370: ReentrantReadWriteLock: threads hung when there are no threads holding onto the lock (Netra x4450)
This day one bug is caused by missing memory barriers in various Parker::park() paths that can result in lost wakeups and hangs. Reviewed-by: dice, acorn
This commit is contained in:
parent
b409d16477
commit
10232cb341
@ -4683,6 +4683,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
// Return immediately if a permit is available.
|
||||
if (_counter > 0) {
|
||||
_counter = 0 ;
|
||||
OrderAccess::fence();
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -4725,6 +4726,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
_counter = 0;
|
||||
status = pthread_mutex_unlock(_mutex);
|
||||
assert (status == 0, "invariant") ;
|
||||
OrderAccess::fence();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4765,6 +4767,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
jt->java_suspend_self();
|
||||
}
|
||||
|
||||
OrderAccess::fence();
|
||||
}
|
||||
|
||||
void Parker::unpark() {
|
||||
|
@ -5803,6 +5803,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
// Return immediately if a permit is available.
|
||||
if (_counter > 0) {
|
||||
_counter = 0 ;
|
||||
OrderAccess::fence();
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -5846,6 +5847,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
_counter = 0;
|
||||
status = os::Solaris::mutex_unlock(_mutex);
|
||||
assert (status == 0, "invariant") ;
|
||||
OrderAccess::fence();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5892,6 +5894,7 @@ void Parker::park(bool isAbsolute, jlong time) {
|
||||
jt->java_suspend_self();
|
||||
}
|
||||
|
||||
OrderAccess::fence();
|
||||
}
|
||||
|
||||
void Parker::unpark() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user