X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=urcu-qsbr.c;h=52cb04aee9ff1b1b5a7b2caef45d6d5b5317ba77;hb=11eb040f24e020d05d65983d0f87f79b000c7b9f;hp=1a94efa61a47fc48e12f9fc671b7c147d29382b4;hpb=a99b1455f89d4b214afcee19799776b45afcfed2;p=userspace-rcu.git diff --git a/urcu-qsbr.c b/urcu-qsbr.c index 1a94efa..52cb04a 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -125,9 +125,22 @@ static void wait_gp(void) { /* Read reader_gp before read futex */ cmm_smp_rmb(); - if (uatomic_read(&gp_futex) == -1) - futex_noasync(&gp_futex, FUTEX_WAIT, -1, - NULL, NULL, 0); + if (uatomic_read(&gp_futex) != -1) + return; + while (futex_noasync(&gp_futex, FUTEX_WAIT, -1, + NULL, NULL, 0)) { + switch (errno) { + case EWOULDBLOCK: + /* Value already changed. */ + return; + case EINTR: + /* Retry if interrupted by signal. */ + break; /* Get out of switch. */ + default: + /* Unexpected error. */ + urcu_die(errno); + } + } } /*