From 07e62953c768f9f09485388c22ffaed98d11d676 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 24 Jul 2012 00:51:36 -0400 Subject: retry on cas failures in sem_trywait this seems counter-intuitive since sem_trywait is supposed to just try once, not wait for the semaphore. however, the retry loop is not a wait. instead, it's to handle the case where the value changes due to a simultaneous post or wait from another thread while the semaphore value remains positive. in such a case, it's absolutely wrong for sem_trywait to fail with EAGAIN because the semaphore is not busy. --- src/thread/sem_trywait.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/thread') diff --git a/src/thread/sem_trywait.c b/src/thread/sem_trywait.c index 55d90075..04edf46b 100644 --- a/src/thread/sem_trywait.c +++ b/src/thread/sem_trywait.c @@ -3,8 +3,8 @@ int sem_trywait(sem_t *sem) { - int val = sem->__val[0]; - if (val>0) { + int val; + while ((val=sem->__val[0]) > 0) { int new = val-1-(val==1 && sem->__val[1]); if (a_cas(sem->__val, val, new)==val) return 0; } -- cgit v1.2.1