Skip to content

Commit dbc620f

Browse files
author
William Kemper
committed
8352299: GenShen: Young cycles that interrupt old cycles cannot be cancelled
Reviewed-by: shade
1 parent f5a0db4 commit dbc620f

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,8 +2171,8 @@ size_t ShenandoahHeap::tlab_used(Thread* thread) const {
21712171
}
21722172

21732173
bool ShenandoahHeap::try_cancel_gc(GCCause::Cause cause) {
2174-
jbyte prev = _cancelled_gc.cmpxchg(cause, GCCause::_no_gc);
2175-
return prev == GCCause::_no_gc;
2174+
const GCCause::Cause prev = _cancelled_gc.xchg(cause);
2175+
return prev == GCCause::_no_gc || prev == GCCause::_shenandoah_concurrent_gc;
21762176
}
21772177

21782178
void ShenandoahHeap::cancel_concurrent_mark() {

src/hotspot/share/gc/shenandoah/shenandoahSharedVariables.hpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,9 @@ typedef struct ShenandoahSharedBitmap {
212212

213213
template<class T>
214214
struct ShenandoahSharedEnumFlag {
215+
typedef uint32_t EnumValueType;
215216
shenandoah_padding(0);
216-
volatile ShenandoahSharedValue value;
217+
volatile EnumValueType value;
217218
shenandoah_padding(1);
218219

219220
ShenandoahSharedEnumFlag() {
@@ -222,8 +223,8 @@ struct ShenandoahSharedEnumFlag {
222223

223224
void set(T v) {
224225
assert (v >= 0, "sanity");
225-
assert (v < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
226-
Atomic::release_store_fence(&value, (ShenandoahSharedValue)v);
226+
assert (v < (sizeof(EnumValueType) * CHAR_MAX), "sanity");
227+
Atomic::release_store_fence(&value, (EnumValueType)v);
227228
}
228229

229230
T get() const {
@@ -232,11 +233,17 @@ struct ShenandoahSharedEnumFlag {
232233

233234
T cmpxchg(T new_value, T expected) {
234235
assert (new_value >= 0, "sanity");
235-
assert (new_value < (sizeof(ShenandoahSharedValue) * CHAR_MAX), "sanity");
236-
return (T)Atomic::cmpxchg(&value, (ShenandoahSharedValue)expected, (ShenandoahSharedValue)new_value);
236+
assert (new_value < (sizeof(EnumValueType) * CHAR_MAX), "sanity");
237+
return (T)Atomic::cmpxchg(&value, (EnumValueType)expected, (EnumValueType)new_value);
237238
}
238239

239-
volatile ShenandoahSharedValue* addr_of() {
240+
T xchg(T new_value) {
241+
assert (new_value >= 0, "sanity");
242+
assert (new_value < (sizeof(EnumValueType) * CHAR_MAX), "sanity");
243+
return (T)Atomic::xchg(&value, (EnumValueType)new_value);
244+
}
245+
246+
volatile EnumValueType* addr_of() {
240247
return &value;
241248
}
242249

0 commit comments

Comments
 (0)