< prev index next >

src/hotspot/os/linux/waitBarrier_linux.cpp

Print this page
rev 53038 : 8214271: Fast primitive to wake many threads
Reviewed-by:
rev 53039 : [mq]: 8214271-3

@@ -36,14 +36,13 @@
                os::errno_name(err));                                        \
 } while (false)
 
 #define guarantee_with_errno(cond, msg) check_with_errno(guarantee, cond, msg)
 
-static int futex(volatile int *uaddr, int futex_op, int val,
-                 const struct timespec *timeout, int *uaddr2, int val3)
+static int futex(volatile int *addr, int futex_op, int op_arg)
 {
-  return syscall(SYS_futex, uaddr, futex_op, val, timeout, uaddr2, val3);
+  return syscall(SYS_futex, addr, futex_op, op_arg, NULL, NULL, 0);
 }
 
 void LinuxWaitBarrier::arm(int barrier_tag) {
   assert(_futex_barrier == 0, "Already armed");
   _futex_barrier = barrier_tag;

@@ -57,15 +56,12 @@
 }
 
 void LinuxWaitBarrier::wake() {
   assert(_futex_barrier == 0, "Not disarmed");
   int s = futex(&_futex_barrier,
-                FUTEX_WAKE,
-                INT_MAX, /* wake a max of this many threads */
-                NULL /* ignored */,
-                NULL /* ignored */,
-                0 /* ignored */);
+                FUTEX_WAKE_PRIVATE,
+                INT_MAX /* wake a max of this many threads */);
   guarantee_with_errno(s > -1, "futex FUTEX_WAKE");
 }
 
 void LinuxWaitBarrier::wait(int barrier_tag) {
   assert(barrier_tag != 0, "Trying to wait on disarmed value");

@@ -74,20 +70,16 @@
     OrderAccess::fence();
     return;
   }
   do {
     int s = futex(&_futex_barrier,
-                  FUTEX_WAIT,
-                  barrier_tag, /* should be this tag */
-                  NULL, /* no timeout */
-                  NULL, /* ignored */
-                  0 /* ignored */);
+                  FUTEX_WAIT_PRIVATE,
+                  barrier_tag /* should be this tag */);
     guarantee_with_errno((s == 0) ||
                          (s == -1 && errno == EAGAIN) ||
                          (s == -1 && errno == EINTR),
                          "futex FUTEX_WAIT");
-    // Return value 0, re-check in case of spurious wake-up.
-    // EINTR and re-check and go back to waiting.
-    // EAGAIN we already are disarmed, we should pass the check,
-    // if not re-armed with same tag.
+    // Return value 0: woken up, but re-check in case of spurious wakeup
+    // Error EINTR: woken by signal, so re-check and re-wait if necessary.
+    // Error EAGAIN: we are already disarmed and so will pass the check
   } while (barrier_tag == _futex_barrier);
 }
< prev index next >