X-Git-Url: http://git.liburcu.org/?p=userspace-rcu.git;a=blobdiff_plain;f=urcu-qsbr.c;h=52cb04aee9ff1b1b5a7b2caef45d6d5b5317ba77;hp=1a94efa61a47fc48e12f9fc671b7c147d29382b4;hb=7a3e2ed26a6be1deac2cfde1d062526497d4ae9f;hpb=66bc4dcd6d823e527395bac6755c17718c3f8e71 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); + } + } } /*