< prev index next >

src/hotspot/os/linux/waitBarrier_linux.cpp

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


  32 #define check_with_errno(check_type, cond, msg)                             \
  33   do {                                                                      \
  34     int err = errno;                                                        \
  35     check_type(cond, "%s; error='%s' (errno=%s)", msg, os::strerror(err),   \
  36                os::errno_name(err));                                        \
  37 } while (false)
  38 
  39 #define guarantee_with_errno(cond, msg) check_with_errno(guarantee, cond, msg)
  40 
  41 static int futex(volatile int *addr, int futex_op, int op_arg)
  42 {
  43   return syscall(SYS_futex, addr, futex_op, op_arg, NULL, NULL, 0);
  44 }
  45 
  46 void LinuxWaitBarrier::arm(int barrier_tag) {
  47   assert(_futex_barrier == 0, "Already armed");
  48   _futex_barrier = barrier_tag;
  49   OrderAccess::fence();
  50 }
  51 
  52 void LinuxWaitBarrier::disarm() {
  53   assert(_futex_barrier != 0, "Not armed");
  54   _futex_barrier = 0;
  55   OrderAccess::fence();
  56 }
  57 
  58 void LinuxWaitBarrier::wake() {
  59   assert(_futex_barrier == 0, "Not disarmed");
  60   int s = futex(&_futex_barrier,
  61                 FUTEX_WAKE_PRIVATE,
  62                 INT_MAX /* wake a max of this many threads */);
  63   guarantee_with_errno(s > -1, "futex FUTEX_WAKE");
  64 }
  65 
  66 void LinuxWaitBarrier::wait(int barrier_tag) {
  67   assert(barrier_tag != 0, "Trying to wait on disarmed value");
  68   if (barrier_tag == 0 ||
  69       barrier_tag != _futex_barrier) {
  70     OrderAccess::fence();
  71     return;
  72   }
  73   do {
  74     int s = futex(&_futex_barrier,
  75                   FUTEX_WAIT_PRIVATE,
  76                   barrier_tag /* should be this tag */);
  77     guarantee_with_errno((s == 0) ||
  78                          (s == -1 && errno == EAGAIN) ||
  79                          (s == -1 && errno == EINTR),


  32 #define check_with_errno(check_type, cond, msg)                             \
  33   do {                                                                      \
  34     int err = errno;                                                        \
  35     check_type(cond, "%s; error='%s' (errno=%s)", msg, os::strerror(err),   \
  36                os::errno_name(err));                                        \
  37 } while (false)
  38 
  39 #define guarantee_with_errno(cond, msg) check_with_errno(guarantee, cond, msg)
  40 
  41 static int futex(volatile int *addr, int futex_op, int op_arg)
  42 {
  43   return syscall(SYS_futex, addr, futex_op, op_arg, NULL, NULL, 0);
  44 }
  45 
  46 void LinuxWaitBarrier::arm(int barrier_tag) {
  47   assert(_futex_barrier == 0, "Already armed");
  48   _futex_barrier = barrier_tag;
  49   OrderAccess::fence();
  50 }
  51 
  52 void LinuxWaitBarrier::wake() {
  53   assert(_futex_barrier != 0, "Not armed");
  54   _futex_barrier = 0;





  55   int s = futex(&_futex_barrier,
  56                 FUTEX_WAKE_PRIVATE,
  57                 INT_MAX /* wake a max of this many threads */);
  58   guarantee_with_errno(s > -1, "futex FUTEX_WAKE");
  59 }
  60 
  61 void LinuxWaitBarrier::wait(int barrier_tag) {
  62   assert(barrier_tag != 0, "Trying to wait on disarmed value");
  63   if (barrier_tag == 0 ||
  64       barrier_tag != _futex_barrier) {
  65     OrderAccess::fence();
  66     return;
  67   }
  68   do {
  69     int s = futex(&_futex_barrier,
  70                   FUTEX_WAIT_PRIVATE,
  71                   barrier_tag /* should be this tag */);
  72     guarantee_with_errno((s == 0) ||
  73                          (s == -1 && errno == EAGAIN) ||
  74                          (s == -1 && errno == EINTR),
< prev index next >