--- old/src/hotspot/share/utilities/waitBarrier_generic.cpp 2018-12-21 09:22:37.069089343 +0100 +++ new/src/hotspot/share/utilities/waitBarrier_generic.cpp 2018-12-21 09:22:36.747078525 +0100 @@ -37,12 +37,6 @@ OrderAccess::fence(); } -void GenericWaitBarrier::disarm() { - assert(_barrier_tag != 0, "Not armed"); - _barrier_tag = 0; - OrderAccess::fence(); -} - int GenericWaitBarrier::wake_if_needed() { assert(_barrier_tag == 0, "Not disarmed"); int w = _waiters; @@ -62,7 +56,10 @@ } void GenericWaitBarrier::wake() { - assert(_barrier_tag == 0, "Not disarmed"); + assert(_barrier_tag != 0, "Not armed"); + _barrier_tag = 0; + // Loads of _barrier_threads/_waiters must not float above disarm store. + OrderAccess::fence(); int left; SpinYield sp; do { @@ -78,6 +75,10 @@ void GenericWaitBarrier::wait(int barrier_tag) { assert(barrier_tag != 0, "Trying to wait on disarmed value"); + if (barrier_tag == 0 && barrier_tag != _barrier_tag) { + OrderAccess::fence(); + return; + } Atomic::add(1, &_barrier_threads); if (barrier_tag != 0 && barrier_tag == _barrier_tag) { Atomic::add(1, &_waiters);