diff options
author | Daniel Eischen <deischen@FreeBSD.org> | 2004-02-04 15:37:48 +0000 |
---|---|---|
committer | Daniel Eischen <deischen@FreeBSD.org> | 2004-02-04 15:37:48 +0000 |
commit | 903f2e5041d4ed6fb226a4b4422ccfcf87f84644 (patch) | |
tree | 5b5c6a221c63764f79f769aa2fb5502cf541ccd7 /lib | |
parent | d17387acd44e2238565b8b38d5740eae45804cf5 (diff) | |
download | src-903f2e5041d4ed6fb226a4b4422ccfcf87f84644.tar.gz src-903f2e5041d4ed6fb226a4b4422ccfcf87f84644.zip |
Allow libc's version of sem_trywait() to work for non-pshared mutexes.
Notes
Notes:
svn path=/head/; revision=125446
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/gen/sem.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/libc/gen/sem.c b/lib/libc/gen/sem.c index 5ab78173de8f..a6c0ddeac784 100644 --- a/lib/libc/gen/sem.c +++ b/lib/libc/gen/sem.c @@ -289,17 +289,32 @@ __sem_wait(sem_t *sem) if (sem_check_validity(sem) != 0) return (-1); - return (ksem_wait((*sem)->semid)); + return (ksem_wait((*sem)->semid)); } int __sem_trywait(sem_t *sem) { + int retval; if (sem_check_validity(sem) != 0) return (-1); - return (ksem_trywait((*sem)->semid)); + if ((*sem)->syssem != 0) + retval = ksem_trywait((*sem)->semid); + else { + _pthread_mutex_lock(&(*sem)->lock); + if ((*sem)->count != 0) { + (*sem)->count--; + retval = 0; + } else { + errno = EAGAIN; + retval = -1; + } + (*sem)->count--; + _pthread_mutex_unlock(&(*sem)->lock); + } + return (retval); } int |