< prev index next >

src/hotspot/share/utilities/waitBarrier_generic.cpp

Print this page
rev 53078 : 8214271: Fast primitive to wake many threads
Reviewed-by:
rev 53079 : [mq]: fix-sema

*** 35,50 **** _barrier_tag = barrier_tag; _waiters = 0; 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; if (w == 0) { // Load of _barrier_threads in caller must not pass the load of _waiters. --- 35,44 ----
*** 60,70 **** } return w; } void GenericWaitBarrier::wake() { ! assert(_barrier_tag == 0, "Not disarmed"); int left; SpinYield sp; do { left = GenericWaitBarrier::wake_if_needed(); if (left == 0 && _barrier_threads > 0) { --- 54,67 ---- } return w; } void GenericWaitBarrier::wake() { ! 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 { left = GenericWaitBarrier::wake_if_needed(); if (left == 0 && _barrier_threads > 0) {
*** 76,85 **** --- 73,86 ---- OrderAccess::fence(); } 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); _sem_barrier.wait(); // We help out with posting, but we need to do so before we decrement the
< prev index next >