aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Eischen <deischen@FreeBSD.org>2004-02-04 15:37:48 +0000
committerDaniel Eischen <deischen@FreeBSD.org>2004-02-04 15:37:48 +0000
commit903f2e5041d4ed6fb226a4b4422ccfcf87f84644 (patch)
tree5b5c6a221c63764f79f769aa2fb5502cf541ccd7 /lib
parentd17387acd44e2238565b8b38d5740eae45804cf5 (diff)
downloadsrc-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.c19
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