< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp
Print this page
*** 57,67 ****
wait_for_no_evac_threads();
return;
}
while (true) {
! jint other = Atomic::cmpxchg(threads_in_evac + 1, &_threads_in_evac, threads_in_evac);
if (other == threads_in_evac) {
// Success: caller may safely enter evacuation
DEBUG_ONLY(ShenandoahThreadLocalData::set_evac_allowed(Thread::current(), true));
return;
} else {
--- 57,67 ----
wait_for_no_evac_threads();
return;
}
while (true) {
! jint other = Atomic::cmpxchg(&_threads_in_evac, threads_in_evac, threads_in_evac + 1);
if (other == threads_in_evac) {
// Success: caller may safely enter evacuation
DEBUG_ONLY(ShenandoahThreadLocalData::set_evac_allowed(Thread::current(), true));
return;
} else {
*** 96,107 ****
assert(ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "sanity");
assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
while (true) {
! jint other = Atomic::cmpxchg((threads_in_evac - 1) | OOM_MARKER_MASK,
! &_threads_in_evac, threads_in_evac);
if (other == threads_in_evac) {
// Success: wait for other threads to get out of the protocol and return.
wait_for_no_evac_threads();
return;
} else {
--- 96,106 ----
assert(ShenandoahThreadLocalData::is_evac_allowed(Thread::current()), "sanity");
assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
while (true) {
! jint other = Atomic::cmpxchg(&_threads_in_evac, threads_in_evac, (threads_in_evac - 1) | OOM_MARKER_MASK);
if (other == threads_in_evac) {
// Success: wait for other threads to get out of the protocol and return.
wait_for_no_evac_threads();
return;
} else {
< prev index next >