From 0223333b35d2ec6e988bded772d98389a5ae4138 Mon Sep 17 00:00:00 2001 From: ru Date: Wed, 14 Jan 2004 20:54:16 +0000 Subject: - libc/sys/sem.c was repocopied to libc/gen/sem.c. - sem_*(3) manpages were repocopied from libc_r. Reviewed by: deischen Repocopy by: markm --- lib/libc/gen/Makefile.inc | 9 +- lib/libc/gen/sem_destroy.3 | 2 +- lib/libc/gen/sem_getvalue.3 | 2 +- lib/libc/gen/sem_init.3 | 2 +- lib/libc/gen/sem_open.3 | 2 +- lib/libc/gen/sem_post.3 | 2 +- lib/libc/gen/sem_wait.3 | 2 +- lib/libc/sys/Makefile.inc | 2 +- lib/libc/sys/sem.c | 357 -------------------------------------------- 9 files changed, 14 insertions(+), 366 deletions(-) delete mode 100644 lib/libc/sys/sem.c (limited to 'lib/libc') diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index e26ed2f..e276306 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -22,7 +22,7 @@ SRCS+= __xuname.c _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \ pause.c pmadvise.c popen.c posixshm.c pselect.c \ psignal.c pw_scan.c pwcache.c \ raise.c readdir.c readpassphrase.c rewinddir.c \ - scandir.c seed48.c seekdir.c semctl.c \ + scandir.c seed48.c seekdir.c sem.c semctl.c \ setdomainname.c sethostname.c setjmperr.c setmode.c \ setproctitle.c setprogname.c \ siginterrupt.c siglist.c signal.c signbit.c \ @@ -53,7 +53,9 @@ MAN+= alarm.3 arc4random.3 \ modf.3 msgctl.3 msgget.3 msgrcv.3 msgsnd.3 \ nice.3 nlist.3 pause.3 popen.3 pselect.3 psignal.3 pwcache.3 \ raise.3 rand48.3 readpassphrase.3 rfork_thread.3 \ - scandir.3 setjmp.3 setmode.3 setproctitle.3 shm_open.3 \ + scandir.3 sem_destroy.3 sem_getvalue.3 sem_init.3 \ + sem_open.3 sem_post.3 sem_wait.3 \ + setjmp.3 setmode.3 setproctitle.3 shm_open.3 \ siginterrupt.3 signal.3 signbit.3 sigsetops.3 sleep.3 \ statvfs.3 stringlist.3 \ strtofflags.3 sysconf.3 sysctl.3 syslog.3 tcgetpgrp.3 \ @@ -125,6 +127,9 @@ MLINKS+=shm_open.3 shm_unlink.3 MLINKS+=sigsetops.3 sigaddset.3 sigsetops.3 sigdelset.3 \ sigsetops.3 sigemptyset.3 sigsetops.3 sigfillset.3 \ sigsetops.3 sigismember.3 +MLINKS+=sem_open.3 sem_close.3 \ + sem_open.3 sem_unlink.3 +MLINKS+=sem_wait.3 sem_trywait.3 MLINKS+=statvfs.3 fstatvfs.3 MLINKS+=stringlist.3 sl_add.3 stringlist.3 sl_find.3 \ stringlist.3 sl_free.3 stringlist.3 sl_init.3 diff --git a/lib/libc/gen/sem_destroy.3 b/lib/libc/gen/sem_destroy.3 index 9b88b02..0d0df30 100644 --- a/lib/libc/gen/sem_destroy.3 +++ b/lib/libc/gen/sem_destroy.3 @@ -33,7 +33,7 @@ .Nm sem_destroy .Nd destroy an unnamed semaphore .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft int diff --git a/lib/libc/gen/sem_getvalue.3 b/lib/libc/gen/sem_getvalue.3 index 694ced4..26a1e149 100644 --- a/lib/libc/gen/sem_getvalue.3 +++ b/lib/libc/gen/sem_getvalue.3 @@ -33,7 +33,7 @@ .Nm sem_getvalue .Nd get the value of a semaphore .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft int diff --git a/lib/libc/gen/sem_init.3 b/lib/libc/gen/sem_init.3 index 46394b4..c55cd75 100644 --- a/lib/libc/gen/sem_init.3 +++ b/lib/libc/gen/sem_init.3 @@ -33,7 +33,7 @@ .Nm sem_init .Nd initialize an unnamed semaphore .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft int diff --git a/lib/libc/gen/sem_open.3 b/lib/libc/gen/sem_open.3 index 6beee26..28ce965 100644 --- a/lib/libc/gen/sem_open.3 +++ b/lib/libc/gen/sem_open.3 @@ -35,7 +35,7 @@ .Nm sem_unlink .Nd named semaphore operations .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft sem_t * diff --git a/lib/libc/gen/sem_post.3 b/lib/libc/gen/sem_post.3 index b36c80f..ce1248a 100644 --- a/lib/libc/gen/sem_post.3 +++ b/lib/libc/gen/sem_post.3 @@ -33,7 +33,7 @@ .Nm sem_post .Nd increment (unlock) a semaphore .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft int diff --git a/lib/libc/gen/sem_wait.3 b/lib/libc/gen/sem_wait.3 index 735061e..1307aab 100644 --- a/lib/libc/gen/sem_wait.3 +++ b/lib/libc/gen/sem_wait.3 @@ -34,7 +34,7 @@ .Nm sem_trywait .Nd decrement (lock) a semaphore .Sh LIBRARY -.Lb libc_r +.Lb libc .Sh SYNOPSIS .In semaphore.h .Ft int diff --git a/lib/libc/sys/Makefile.inc b/lib/libc/sys/Makefile.inc index cc4b45ca..7c3456d 100644 --- a/lib/libc/sys/Makefile.inc +++ b/lib/libc/sys/Makefile.inc @@ -18,7 +18,7 @@ .endif # Sources common to both syscall interfaces: -SRCS+= ftruncate.c lseek.c mmap.c pread.c pwrite.c sem.c truncate.c __error.c +SRCS+= ftruncate.c lseek.c mmap.c pread.c pwrite.c truncate.c __error.c # Add machine dependent asm sources: SRCS+=${MDASM} diff --git a/lib/libc/sys/sem.c b/lib/libc/sys/sem.c deleted file mode 100644 index e37eccd..0000000 --- a/lib/libc/sys/sem.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (C) 2000 Jason Evans . - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice(s), this list of conditions and the following disclaimer as - * the first lines of this file unmodified other than the possible - * addition of one or more copyright notices. - * 2. Redistributions in binary form must reproduce the above copyright - * notice(s), this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include "namespace.h" -#include -#include -#include -#include -#include -#include -#include -#include <_semaphore.h> -#include "un-namespace.h" - -#define _SEM_CHECK_VALIDITY(sem) \ - if ((*(sem))->magic != SEM_MAGIC) { \ - errno = EINVAL; \ - retval = -1; \ - goto RETURN; \ - } - -static sem_t sem_alloc(unsigned int value, semid_t semid, int system_sem); -static void sem_free(sem_t sem); - -static LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(&named_sems); -static pthread_mutex_t named_sems_mtx = PTHREAD_MUTEX_INITIALIZER; - -static void -sem_free(sem_t sem) -{ - - _pthread_mutex_destroy(&sem->lock); - _pthread_cond_destroy(&sem->gtzero); - sem->magic = 0; - free(sem); -} - -static sem_t -sem_alloc(unsigned int value, semid_t semid, int system_sem) -{ - sem_t sem; - - if (value > SEM_VALUE_MAX) { - errno = EINVAL; - return (NULL); - } - - sem = (sem_t)malloc(sizeof(struct sem)); - if (sem == NULL) { - errno = ENOSPC; - return (NULL); - } - - /* - * Initialize the semaphore. - */ - if (_pthread_mutex_init(&sem->lock, NULL) != 0) { - free(sem); - errno = ENOSPC; - return (NULL); - } - - if (_pthread_cond_init(&sem->gtzero, NULL) != 0) { - _pthread_mutex_destroy(&sem->lock); - free(sem); - errno = ENOSPC; - return (NULL); - } - - sem->count = (u_int32_t)value; - sem->nwaiters = 0; - sem->magic = SEM_MAGIC; - sem->semid = semid; - sem->syssem = system_sem; - return (sem); -} - -int -sem_init(sem_t *sem, int pshared, unsigned int value) -{ - int retval, got_system_sem; - semid_t semid; - - got_system_sem = 0; - semid = SEM_USER; - /* - * Range check the arguments. - */ - if (pshared != 0) { - retval = ksem_init(&semid, value); - if (retval == -1) - goto RETURN; - got_system_sem = 1; - } - - (*sem) = sem_alloc(value, semid, got_system_sem); - if ((*sem) == NULL) - retval = -1; - else - retval = 0; - RETURN: - if (retval != 0 && got_system_sem) - ksem_destroy(semid); - return retval; -} - -int -sem_destroy(sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - _pthread_mutex_lock(&(*sem)->lock); - /* - * If this is a system semaphore let the kernel track it otherwise - * make sure there are no waiters. - */ - if ((*sem)->syssem != 0) { - retval = ksem_destroy((*sem)->semid); - if (retval == -1) { - _pthread_mutex_unlock(&(*sem)->lock); - goto RETURN; - } - } else if ((*sem)->nwaiters > 0) { - _pthread_mutex_unlock(&(*sem)->lock); - errno = EBUSY; - retval = -1; - goto RETURN; - } - _pthread_mutex_unlock(&(*sem)->lock); - - sem_free(*sem); - - retval = 0; - RETURN: - return retval; -} - -sem_t * -sem_open(const char *name, int oflag, ...) -{ - sem_t *sem; - sem_t s; - semid_t semid; - mode_t mode; - unsigned int value; - - mode = 0; - value = 0; - - if ((oflag & O_CREAT) != 0) { - va_list ap; - - va_start(ap, oflag); - mode = va_arg(ap, int); - value = va_arg(ap, unsigned int); - va_end(ap); - } - /* - * we can be lazy and let the kernel handle the "oflag", - * we'll just merge duplicate IDs into our list. - */ - if (ksem_open(&semid, name, oflag, mode, value) == -1) - return (SEM_FAILED); - /* - * search for a duplicate ID, we must return the same sem_t * - * if we locate one. - */ - _pthread_mutex_lock(&named_sems_mtx); - LIST_FOREACH(s, &named_sems, entry) { - if (s->semid == semid) { - _pthread_mutex_unlock(&named_sems_mtx); - return (s->backpointer); - } - } - sem = (sem_t *)malloc(sizeof(*sem)); - if (sem == NULL) - goto err; - *sem = sem_alloc(value, semid, 1); - if ((*sem) == NULL) - goto err; - LIST_INSERT_HEAD(&named_sems, *sem, entry); - (*sem)->backpointer = sem; - _pthread_mutex_unlock(&named_sems_mtx); - return (sem); -err: - _pthread_mutex_unlock(&named_sems_mtx); - ksem_close(semid); - if (sem != NULL) { - if (*sem != NULL) - sem_free(*sem); - else - errno = ENOSPC; - free(sem); - } else { - errno = ENOSPC; - } - return (SEM_FAILED); -} - -int -sem_close(sem_t *sem) -{ - - if ((*sem)->syssem == 0) { - errno = EINVAL; - return (-1); - } - _pthread_mutex_lock(&named_sems_mtx); - if (ksem_close((*sem)->semid) == -1) { - _pthread_mutex_unlock(&named_sems_mtx); - return (-1); - } - LIST_REMOVE((*sem), entry); - _pthread_mutex_unlock(&named_sems_mtx); - sem_free(*sem); - free(sem); - return (0); -} - -int -sem_unlink(const char *name) -{ - - return (ksem_unlink(name)); -} - -int -sem_wait(sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - if ((*sem)->syssem != 0) { - retval = ksem_wait((*sem)->semid); - goto RETURN; - } - - _pthread_mutex_lock(&(*sem)->lock); - - while ((*sem)->count == 0) { - (*sem)->nwaiters++; - _pthread_cond_wait(&(*sem)->gtzero, &(*sem)->lock); - (*sem)->nwaiters--; - } - (*sem)->count--; - - _pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -sem_trywait(sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - if ((*sem)->syssem != 0) { - retval = ksem_trywait((*sem)->semid); - goto RETURN; - } - - _pthread_mutex_lock(&(*sem)->lock); - - if ((*sem)->count > 0) { - (*sem)->count--; - retval = 0; - } else { - errno = EAGAIN; - retval = -1; - } - - _pthread_mutex_unlock(&(*sem)->lock); - - RETURN: - return retval; -} - -int -sem_post(sem_t *sem) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - if ((*sem)->syssem != 0) { - retval = ksem_post((*sem)->semid); - goto RETURN; - } - - _pthread_mutex_lock(&(*sem)->lock); - - (*sem)->count++; - if ((*sem)->nwaiters > 0) - _pthread_cond_signal(&(*sem)->gtzero); - - _pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} - -int -sem_getvalue(sem_t * __restrict sem, int * __restrict sval) -{ - int retval; - - _SEM_CHECK_VALIDITY(sem); - - if ((*sem)->syssem != 0) { - retval = ksem_getvalue((*sem)->semid, sval); - goto RETURN; - } - - _pthread_mutex_lock(&(*sem)->lock); - *sval = (int)(*sem)->count; - _pthread_mutex_unlock(&(*sem)->lock); - - retval = 0; - RETURN: - return retval; -} -- cgit v1.1