< prev index next >

src/hotspot/share/utilities/waitBarrier.hpp

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

@@ -36,46 +36,43 @@
 #else
 typedef GenericWaitBarrier WaitBarrierDefault;
 #endif
 
 // Platform independent WaitBarrier API.
-// An armed WaitBarrier prevents threads from advancing until the
-// barrier is disarmed and the waiting threads woken. The barrier is
-// armed by setting a non-zero value - the tag.
-// When the WaitBarrier is created, a thread is designated the owner
-// and is the thread that should arm/disarm/wake the WaitBarrier. In
-// debug builds this is enforced.
+// An armed WaitBarrier prevents threads from advancing until the threads are
+// woken by calling wake(). The barrier is armed by setting a non-zero value
+// - the tag. When the WaitBarrier is created, a thread is designated the owner
+// and is the thread that should arm and wake the WaitBarrier. In debug builds
+// this is enforced.
 //
 // Expected Usage:
 //  - Arming thread:
 //     tag = ...;  // non-zero value
 //     barrier.arm(tag);
 //     <publish tag>
 //     <work>
-//     barrier.disarm();
 //     barrier.wake();
 //
 //    - After arm(tag) returns any thread calling wait(tag) will block.
-//    - After disarm() returns any subsequent calls to wait(tag) will not block.
-//    - After wake() returns all blocked threads are unblocked and eligible to
-//      execute again.
-//    - After calling disarm() and wake() the barrier is ready to be re-armed
-//      with a new tag. (may not be re-armed with last used tag)
+//    - Calling wake() guarantees any thread calling or called wait(tag) will
+//      return. Either they will see the WaitBarrier as disarmed or they will be
+//      unblocked and eligible to execute again when wake() returns.
+//    - After calling wake() the barrier is ready to be re-armed with a new tag.
+//      (may not be re-armed with last used tag)
 //
 //  - Waiting threads
 //     wait(tag); // don't execute following code unless 'safe'
 //     <work>
 //
 //    - A call to wait(tag) will block if the barrier is armed with the value
 //      'tag'; else it will return immediately.
 //    - A blocked thread is eligible to execute again once the barrier is
-//      disarmed and wake() has been called.
+//      disarmed when wake() has been called.
 //
 // It is a usage error to:
-//  - call wake on a barrier that is still armed
 //  - call arm on a barrier that is already armed
-//  - call disarm on a barrier that is not armed
+//  - call wake on a barrier that is not armed
 //  - arm with the same tag as last used
 // Usage errors are checked in debug builds but may be ignored otherwise.
 //
 // A primary goal of the WaitBarrier implementation is to wake all waiting
 // threads as fast, and as concurrently, as possible.

@@ -114,28 +111,20 @@
   assert(_owner == Thread::current(), "Not owner thread");
 #endif
     _impl.arm(barrier_tag);
   }
 
-  // Guarantees any thread calling wait() with any tag will not be blocked.
-  // Provides a trailing fence.
-  void disarm() {
-    assert(_owner == Thread::current(), "Not owner thread");
-    _impl.disarm();
-  }
-
   // Guarantees any thread called wait() will be awake when it returns.
   // Provides a trailing fence.
   void wake() {
     assert(_owner == Thread::current(), "Not owner thread");
     _impl.wake();
   }
 
-  // Guarantees not to return until disarm() is called,
+  // Guarantees not to return until wake() is called,
   // if called with currently armed tag (otherwise returns immediately).
   // Implementations must guarantee no spurious wakeups.
-  // Guarantees to return if disarm() and wake() is called.
   // Provides a trailing fence.
   void wait(int barrier_tag) {
     assert(_owner != Thread::current(), "Trying to wait with owner thread");
     _impl.wait(barrier_tag);
   }
< prev index next >