fix some semaphore wait semantics (race condition deadlock and error checking)

This commit is contained in:
Rich Felker
2011-03-10 21:52:18 -05:00
parent 81af503610
commit cfe581b6bc
2 changed files with 7 additions and 1 deletions

View File

@ -5,7 +5,8 @@ int sem_trywait(sem_t *sem)
{
int val = a_fetch_add(sem->__val, -1);
if (val > 0) return 0;
a_inc(sem->__val);
if (!a_fetch_add(sem->__val, 1))
__wake(sem->__val, 1, 0);
errno = EAGAIN;
return -1;
}