diff options
author | alfred <alfred@FreeBSD.org> | 2002-09-19 00:43:32 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2002-09-19 00:43:32 +0000 |
commit | d063152de15b045caca51218d4f7046ceaf07fbe (patch) | |
tree | 03a4032eb3cb9c260f9b522b0e619f27dfa99d94 /sys/posix4 | |
parent | 6ac7d5d588d5761ad6b9baeffb32c74bcff7217b (diff) | |
download | FreeBSD-src-d063152de15b045caca51218d4f7046ceaf07fbe.zip FreeBSD-src-d063152de15b045caca51218d4f7046ceaf07fbe.tar.gz |
Add the rest of the kernel support for the sem_ API in kern/uipc_sem.c.
Option 'P1003_1B_SEMAPHORES' to compile them in, or load the "sem" module
to activate them.
Have kern/makesyscalls.sh emit an include for sys/_semaphore.h into sysproto.h
to pull in the typedef for semid_t.
Add the syscalls to the syscall table as module stubs.
Diffstat (limited to 'sys/posix4')
-rw-r--r-- | sys/posix4/_semaphore.h | 71 | ||||
-rw-r--r-- | sys/posix4/posix4.h | 1 | ||||
-rw-r--r-- | sys/posix4/posix4_mib.c | 13 |
3 files changed, 84 insertions, 1 deletions
diff --git a/sys/posix4/_semaphore.h b/sys/posix4/_semaphore.h new file mode 100644 index 0000000..0024c72 --- /dev/null +++ b/sys/posix4/_semaphore.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002 Alfred Perlstein <alfred@FreeBSD.org> + * 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, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, 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 AUTHOR AND CONTRIBUTORS ``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 AUTHOR OR CONTRIBUTORS 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$ + */ +#ifndef __SEMAPHORE_H_ +#define __SEMAPHORE_H_ + +typedef intptr_t semid_t; + +#ifndef _KERNEL + +#include <sys/cdefs.h> + +/* + * Semaphore definitions. + */ +struct sem { +#define SEM_MAGIC ((u_int32_t) 0x09fa4012) + u_int32_t magic; + pthread_mutex_t lock; + pthread_cond_t gtzero; + u_int32_t count; + u_int32_t nwaiters; +#define SEM_USER (NULL) + semid_t semid; /* semaphore id if kernel (shared) semaphore */ + int syssem; /* 1 if kernel (shared) semaphore */ + LIST_ENTRY(sem) entry; + struct sem **backpointer; +}; + +__BEGIN_DECLS + +int ksem_close(semid_t id); +int ksem_post(semid_t id); +int ksem_wait(semid_t id); +int ksem_trywait(semid_t id); +int ksem_init(semid_t *idp, unsigned int value); +int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, + unsigned int value); +int ksem_unlink(const char *name); +int ksem_getvalue(semid_t id, int *val); +int ksem_destroy(semid_t id); + +__END_DECLS + +#endif /* !_KERNEL */ + +#endif /* __SEMAPHORE_H_ */ diff --git a/sys/posix4/posix4.h b/sys/posix4/posix4.h index 9b3c66e..9efd1d9 100644 --- a/sys/posix4/posix4.h +++ b/sys/posix4/posix4.h @@ -64,6 +64,7 @@ MALLOC_DECLARE(M_P31B); int p31b_proc(struct proc *, pid_t, struct proc **); void p31b_setcfg(int, int); +int p31b_getcfg(int); #ifdef _KPOSIX_PRIORITY_SCHEDULING diff --git a/sys/posix4/posix4_mib.c b/sys/posix4/posix4_mib.c index 09af27d..d368593 100644 --- a/sys/posix4/posix4_mib.c +++ b/sys/posix4/posix4_mib.c @@ -92,12 +92,23 @@ P1B_SYSCTL(CTL_P1003_1B_TIMER_MAX, timer_max); /* p31b_setcfg: Set the configuration */ -void p31b_setcfg(int num, int value) +void +p31b_setcfg(int num, int value) { + if (num >= 1 && num < CTL_P1003_1B_MAXID) facility[num - 1] = value; } +int +p31b_getcfg(int num) +{ + + if (num >= 1 && num < CTL_P1003_1B_MAXID) + return (facility[num - 1]); + return (0); +} + /* * Turn on indications for standard (non-configurable) kernel features. */ |