X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu-qsbr.c;h=428e9251c0b75f654c8ecd2a7f2edb0645d4839e;hb=52c67a3d6139a6bf56b97ed350c7f3beaef3ce67;hp=b01294accd3fd0cdb3bbe5934b5cff582b4eabf0;hpb=3887117a5650a14b8b9cc95e2e73bc269575bf46;p=userspace-rcu.git diff --git a/urcu-qsbr.c b/urcu-qsbr.c index b01294a..428e925 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -126,9 +126,22 @@ static void wait_gp(void) { /* Read reader_gp before read futex */ cmm_smp_rmb(); - if (uatomic_read(&rcu_gp.futex) == -1) - futex_noasync(&rcu_gp.futex, FUTEX_WAIT, -1, - NULL, NULL, 0); + if (uatomic_read(&rcu_gp.futex) != -1) + return; + while (futex_noasync(&rcu_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); + } + } } /*