Skip to content

Commit d4b5dfd

Browse files
committed
8253857: Shenandoah: Bugs in ShenandoahEvacOOMHandler related code
Reviewed-by: rkennke
1 parent e9c1905 commit d4b5dfd

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,18 @@ void ShenandoahEvacOOMHandler::register_thread(Thread* thr) {
5050

5151
assert(!ShenandoahThreadLocalData::is_oom_during_evac(Thread::current()), "TL oom-during-evac must not be set");
5252
while (true) {
53+
// Check for OOM.
54+
// If offender has OOM_MARKER_MASK, then loop until no more threads in evac
55+
if ((threads_in_evac & OOM_MARKER_MASK) != 0) {
56+
wait_for_no_evac_threads();
57+
return;
58+
}
59+
5360
jint other = Atomic::cmpxchg(&_threads_in_evac, threads_in_evac, threads_in_evac + 1);
5461
if (other == threads_in_evac) {
5562
// Success: caller may safely enter evacuation
5663
return;
5764
} else {
58-
// Failure:
59-
// - if offender has OOM_MARKER_MASK, then loop until no more threads in evac
60-
// - otherwise re-try CAS
61-
if ((other & OOM_MARKER_MASK) != 0) {
62-
wait_for_no_evac_threads();
63-
return;
64-
}
6565
threads_in_evac = other;
6666
}
6767
}

src/hotspot/share/gc/shenandoah/shenandoahEvacOOMHandler.inline.hpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,18 @@ void ShenandoahEvacOOMHandler::enter_evacuation(Thread* thr) {
3434
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
3535

3636
uint8_t level = ShenandoahThreadLocalData::push_evac_oom_scope(thr);
37-
if ((threads_in_evac & OOM_MARKER_MASK) != 0) {
38-
wait_for_no_evac_threads();
39-
return;
40-
}
41-
42-
// Nesting case, this thread already registered
43-
if (level != 0) {
44-
return;
45-
}
46-
// Entering top level scope, register this thread.
47-
register_thread(thr);
37+
if (level == 0) {
38+
// Entering top level scope, register this thread.
39+
register_thread(thr);
40+
} else if (!ShenandoahThreadLocalData::is_oom_during_evac(thr)) {
41+
jint threads_in_evac = Atomic::load_acquire(&_threads_in_evac);
42+
// If OOM is in progress, handle it.
43+
if ((threads_in_evac & OOM_MARKER_MASK) != 0) {
44+
assert((threads_in_evac & ~OOM_MARKER_MASK) > 0, "sanity");
45+
Atomic::dec(&_threads_in_evac);
46+
wait_for_no_evac_threads();
47+
}
48+
}
4849
}
4950

5051
void ShenandoahEvacOOMHandler::leave_evacuation(Thread* thr) {

0 commit comments

Comments
 (0)