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),
|