Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Sep 2002 16:08:54 -0700
From:      Alfred Perlstein <bright@mu.org>
To:        hackers@freebsd.org
Subject:   sem_* API
Message-ID:  <20020916230854.GA86737@elvis.mu.org>

next in thread | raw e-mail | index | archive | help
I got sort of bored so I wrote a kernel version of the POSIX sem_*
functions so that we can support sem_open() and sem_init() when 'pshared'
is set to true.  Basically this is posix semaphores that can be used
between processes.

I haven't tested it as of yet (but I will be soon), here's the delta
for it.

Does anyone know a test suite for this API?


Index: include/Makefile
===================================================================
RCS file: /home/ncvs/src/include/Makefile,v
retrieving revision 1.175
diff -u -r1.175 Makefile
--- include/Makefile	8 Aug 2002 04:50:36 -0000	1.175
+++ include/Makefile	16 Sep 2002 19:07:38 -0000
@@ -27,7 +27,7 @@
 MHDRS=	float.h floatingpoint.h stdarg.h varargs.h
 
 # posix4/aio.h conflicts with dysons and isn't installed:
-PHDRS=	mqueue.h sched.h semaphore.h # aio.h
+PHDRS=	mqueue.h sched.h semaphore.h _semaphore.h # aio.h
 
 LHDRS=	aio.h errno.h fcntl.h linker_set.h poll.h stdint.h syslog.h \
 	termios.h ucontext.h
Index: lib/libpthread/thread/thr_private.h
===================================================================
RCS file: /home/ncvs/src/lib/libpthread/thread/thr_private.h,v
retrieving revision 1.74
diff -u -r1.74 thr_private.h
--- lib/libpthread/thread/thr_private.h	16 Sep 2002 08:45:35 -0000	1.74
+++ lib/libpthread/thread/thr_private.h	16 Sep 2002 22:41:20 -0000
@@ -60,6 +60,7 @@
 #include <spinlock.h>
 #include <ucontext.h>
 #include <pthread_np.h>
+#include <posix4/_semaphore.h>
 
 /*
  * Define machine dependent macros to get and set the stack pointer
@@ -369,6 +370,11 @@
 	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;
+	sem_t		*backpointer;
 };
 
 /*
Index: lib/libpthread/thread/thr_sem.c
===================================================================
RCS file: /home/ncvs/src/lib/libpthread/thread/thr_sem.c,v
retrieving revision 1.11
diff -u -r1.11 thr_sem.c
--- lib/libpthread/thread/thr_sem.c	16 Sep 2002 08:45:36 -0000	1.11
+++ lib/libpthread/thread/thr_sem.c	16 Sep 2002 22:48:36 -0000
@@ -31,7 +31,9 @@
 
 #include <stdlib.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <semaphore.h>
+#include <stdarg.h>
 #include <pthread.h>
 #include "thr_private.h"
 
@@ -52,63 +54,86 @@
 __weak_reference(_sem_post, sem_post);
 __weak_reference(_sem_getvalue, sem_getvalue);
 
+static sem_t sem_alloc(unsigned int value, semid_t semid, int system_sem);
+static void sem_free(sem_t sem);
 
-int
-_sem_init(sem_t *sem, int pshared, unsigned int value)
+static void
+sem_free(sem_t sem)
 {
-	int	retval;
 
-	/*
-	 * Range check the arguments.
-	 */
-	if (pshared != 0) {
-		/*
-		 * The user wants a semaphore that can be shared among
-		 * processes, which this implementation can't do.  Sounds like a
-		 * permissions problem to me (yeah right).
-		 */
-		errno = EPERM;
-		retval = -1;
-		goto RETURN;
-	}
+	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;
-		retval = -1;
-		goto RETURN;
+		return (NULL);
 	}
 
-	*sem = (sem_t)malloc(sizeof(struct sem));
-	if (*sem == NULL) {
+	sem = (sem_t)malloc(sizeof(struct sem));
+	if (sem == NULL) {
 		errno = ENOSPC;
-		retval = -1;
-		goto RETURN;
+		return (NULL);
 	}
 
 	/*
 	 * Initialize the semaphore.
 	 */
-	if (pthread_mutex_init(&(*sem)->lock, NULL) != 0) {
-		free(*sem);
+	if (pthread_mutex_init(&sem->lock, NULL) != 0) {
+		free(sem);
 		errno = ENOSPC;
-		retval = -1;
-		goto RETURN;
+		return (NULL);
 	}
 
-	if (pthread_cond_init(&(*sem)->gtzero, NULL) != 0) {
-		pthread_mutex_destroy(&(*sem)->lock);
-		free(*sem);
+	if (pthread_cond_init(&sem->gtzero, NULL) != 0) {
+		pthread_mutex_destroy(&sem->lock);
+		free(sem);
 		errno = ENOSPC;
-		retval = -1;
-		goto RETURN;
+		return (NULL);
 	}
 	
-	(*sem)->count = (u_int32_t)value;
-	(*sem)->nwaiters = 0;
-	(*sem)->magic = SEM_MAGIC;
+	sem->count = (u_int32_t)value;
+	sem->nwaiters = 0;
+	sem->magic = SEM_MAGIC;
+	sem->semid = semid;
+	sem->syssem = system_sem;
+	return (sem);
+}
 
-	retval = 0;
+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;
 }
 
@@ -119,46 +144,121 @@
 	
 	_SEM_CHECK_VALIDITY(sem);
 
-	/* Make sure there are no waiters. */
 	pthread_mutex_lock(&(*sem)->lock);
-	if ((*sem)->nwaiters > 0) {
+	/*
+	 * 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);
-	
-	pthread_mutex_destroy(&(*sem)->lock);
-	pthread_cond_destroy(&(*sem)->gtzero);
-	(*sem)->magic = 0;
 
-	free(*sem);
+	sem_free(*sem);	
 
 	retval = 0;
   RETURN:
 	return retval;
 }
 
+LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(&named_sems);
+pthread_mutex_t named_sems_mtx = PTHREAD_MUTEX_INITIALIZER;
+
 sem_t *
 _sem_open(const char *name, int oflag, ...)
 {
-	errno = ENOSYS;
-	return SEM_FAILED;
+	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, unsigned long);
+		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;
+	pthread_mutex_unlock(&named_sems_mtx);
+	(*sem)->backpointer = sem;
+	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)
 {
-	errno = ENOSYS;
-	return -1;
+
+	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)
 {
-	errno = ENOSYS;
-	return -1;
+
+	return (ksem_unlink(name));
 }
 
 int
@@ -170,6 +270,11 @@
 	
 	_SEM_CHECK_VALIDITY(sem);
 
+	if ((*sem)->syssem != 0) {
+		retval = ksem_wait((*sem)->semid);
+		goto RETURN;
+	}
+
 	pthread_mutex_lock(&(*sem)->lock);
 
 	while ((*sem)->count == 0) {
@@ -194,6 +299,11 @@
 
 	_SEM_CHECK_VALIDITY(sem);
 
+	if ((*sem)->syssem != 0) {
+		retval = ksem_trywait((*sem)->semid);
+		goto RETURN;
+	}
+
 	pthread_mutex_lock(&(*sem)->lock);
 
 	if ((*sem)->count > 0) {
@@ -217,6 +327,11 @@
 
 	_SEM_CHECK_VALIDITY(sem);
 
+	if ((*sem)->syssem != 0) {
+		retval = ksem_post((*sem)->semid);
+		goto RETURN;
+	}
+
 	/*
 	 * sem_post() is required to be safe to call from within signal
 	 * handlers.  Thus, we must defer signals.
@@ -243,6 +358,11 @@
 	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;
Index: sys/conf/NOTES
===================================================================
RCS file: /home/ncvs/src/sys/conf/NOTES,v
retrieving revision 1.1075
diff -u -r1.1075 NOTES
--- sys/conf/NOTES	11 Sep 2002 05:33:09 -0000	1.1075
+++ sys/conf/NOTES	16 Sep 2002 23:00:26 -0000
@@ -746,6 +746,7 @@
 options 	P1003_1B
 options 	_KPOSIX_PRIORITY_SCHEDULING
 options 	_KPOSIX_VERSION=199309L
+options		P1003_1B_SEMAPHORES
 
 
 #####################################################################
Index: sys/conf/files
===================================================================
RCS file: /home/ncvs/src/sys/conf/files,v
retrieving revision 1.698
diff -u -r1.698 files
--- sys/conf/files	16 Sep 2002 04:13:48 -0000	1.698
+++ sys/conf/files	16 Sep 2002 16:37:48 -0000
@@ -1423,3 +1423,4 @@
 vm/uma_core.c		standard
 vm/uma_dbg.c		standard
 vm/vnode_pager.c	standard
+kern/uipc_sem.c		standard
Index: sys/conf/options
===================================================================
RCS file: /home/ncvs/src/sys/conf/options,v
retrieving revision 1.348
diff -u -r1.348 options
--- sys/conf/options	7 Sep 2002 22:07:10 -0000	1.348
+++ sys/conf/options	16 Sep 2002 18:37:11 -0000
@@ -132,6 +132,7 @@
 P1003_1B			opt_posix.h
 _KPOSIX_PRIORITY_SCHEDULING	opt_posix.h
 _KPOSIX_VERSION			opt_posix.h
+P1003_1B_SEMAPHORES		opt_posix.h
 
 #####################################################################
 # SECURITY POLICY PARAMETERS
Index: sys/kern/init_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/init_sysent.c,v
retrieving revision 1.131
diff -u -r1.131 init_sysent.c
--- sys/kern/init_sysent.c	19 Aug 2002 20:02:29 -0000	1.131
+++ sys/kern/init_sysent.c	16 Sep 2002 17:25:15 -0000
@@ -2,7 +2,7 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/init_sysent.c,v 1.131 2002/08/19 20:02:29 rwatson Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.121 2002/08/19 20:01:31 rwatson Exp 
  */
 
@@ -423,4 +423,18 @@
 	{ AS(uuidgen_args), (sy_call_t *)uuidgen },	/* 392 = uuidgen */
 	{ SYF_MPSAFE | AS(sendfile_args), (sy_call_t *)sendfile },	/* 393 = sendfile */
 	{ SYF_MPSAFE | AS(mac_syscall_args), (sy_call_t *)mac_syscall },	/* 394 = mac_syscall */
+	{ 0, (sy_call_t *)nosys },			/* 395 = nosys */
+	{ 0, (sy_call_t *)nosys },			/* 396 = nosys */
+	{ 0, (sy_call_t *)nosys },			/* 397 = nosys */
+	{ 0, (sy_call_t *)nosys },			/* 398 = nosys */
+	{ 0, (sy_call_t *)nosys },			/* 399 = nosys */
+	{ SYF_MPSAFE | AS(ksem_close_args), (sy_call_t *)lkmressys },	/* 400 = ksem_close */
+	{ SYF_MPSAFE | AS(ksem_post_args), (sy_call_t *)lkmressys },	/* 401 = ksem_post */
+	{ SYF_MPSAFE | AS(ksem_wait_args), (sy_call_t *)lkmressys },	/* 402 = ksem_wait */
+	{ SYF_MPSAFE | AS(ksem_trywait_args), (sy_call_t *)lkmressys },	/* 403 = ksem_trywait */
+	{ SYF_MPSAFE | AS(ksem_init_args), (sy_call_t *)lkmressys },	/* 404 = ksem_init */
+	{ SYF_MPSAFE | AS(ksem_open_args), (sy_call_t *)lkmressys },	/* 405 = ksem_open */
+	{ SYF_MPSAFE | AS(ksem_unlink_args), (sy_call_t *)lkmressys },	/* 406 = ksem_unlink */
+	{ SYF_MPSAFE | AS(ksem_getvalue_args), (sy_call_t *)lkmressys },	/* 407 = ksem_getvalue */
+	{ SYF_MPSAFE | AS(ksem_destroy_args), (sy_call_t *)lkmressys },	/* 408 = ksem_destroy */
 };
Index: sys/kern/makesyscalls.sh
===================================================================
RCS file: /home/ncvs/src/sys/kern/makesyscalls.sh,v
retrieving revision 1.56
diff -u -r1.56 makesyscalls.sh
--- sys/kern/makesyscalls.sh	12 Jul 2002 06:38:34 -0000	1.56
+++ sys/kern/makesyscalls.sh	16 Sep 2002 05:59:59 -0000
@@ -115,8 +115,9 @@
 		printf " * created from%s\n */\n\n", $0 > sysarg
 		printf "#ifndef %s\n", sysproto_h > sysarg
 		printf "#define\t%s\n\n", sysproto_h > sysarg
-		printf "#include <sys/signal.h>\n\n" > sysarg
-		printf "#include <sys/acl.h>\n\n" > sysarg
+		printf "#include <sys/signal.h>\n" > sysarg
+		printf "#include <sys/acl.h>\n" > sysarg
+		printf "#include <posix4/_semaphore.h>\n\n" > sysarg
 		printf "struct proc;\n\n" > sysarg
 		printf "struct thread;\n\n" > sysarg
 		printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg
Index: sys/kern/syscalls.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/syscalls.c,v
retrieving revision 1.117
diff -u -r1.117 syscalls.c
--- sys/kern/syscalls.c	19 Aug 2002 20:02:29 -0000	1.117
+++ sys/kern/syscalls.c	16 Sep 2002 17:25:15 -0000
@@ -2,7 +2,7 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/syscalls.c,v 1.117 2002/08/19 20:02:29 rwatson Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.121 2002/08/19 20:01:31 rwatson Exp 
  */
 
@@ -402,4 +402,18 @@
 	"uuidgen",			/* 392 = uuidgen */
 	"sendfile",			/* 393 = sendfile */
 	"mac_syscall",			/* 394 = mac_syscall */
+	"#395",			/* 395 = nosys */
+	"#396",			/* 396 = nosys */
+	"#397",			/* 397 = nosys */
+	"#398",			/* 398 = nosys */
+	"#399",			/* 399 = nosys */
+	"ksem_close",			/* 400 = ksem_close */
+	"ksem_post",			/* 401 = ksem_post */
+	"ksem_wait",			/* 402 = ksem_wait */
+	"ksem_trywait",			/* 403 = ksem_trywait */
+	"ksem_init",			/* 404 = ksem_init */
+	"ksem_open",			/* 405 = ksem_open */
+	"ksem_unlink",			/* 406 = ksem_unlink */
+	"ksem_getvalue",			/* 407 = ksem_getvalue */
+	"ksem_destroy",			/* 408 = ksem_destroy */
 };
Index: sys/kern/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/kern/syscalls.master,v
retrieving revision 1.121
diff -u -r1.121 syscalls.master
--- sys/kern/syscalls.master	19 Aug 2002 20:01:31 -0000	1.121
+++ sys/kern/syscalls.master	16 Sep 2002 17:25:09 -0000
@@ -569,3 +569,18 @@
 				struct sf_hdtr *hdtr, off_t *sbytes, int flags); }
 394	MSTD	BSD	{ int mac_syscall(const char *policy, int call, \
 				void *arg); }
+395	UNIMPL	NOHIDE	nosys
+396	UNIMPL	NOHIDE	nosys
+397	UNIMPL	NOHIDE	nosys
+398	UNIMPL	NOHIDE	nosys
+399	UNIMPL	NOHIDE	nosys
+400	MNOSTD	BSD	{ int ksem_close(semid_t id); }
+401	MNOSTD	BSD	{ int ksem_post(semid_t id); }
+402	MNOSTD	BSD	{ int ksem_wait(semid_t id); }
+403	MNOSTD	BSD	{ int ksem_trywait(semid_t id); }
+404	MNOSTD	BSD	{ int ksem_init(semid_t *idp, unsigned int value); }
+405	MNOSTD	BSD	{ int ksem_open(semid_t *idp, const char *name, \
+				int oflag, mode_t mode, unsigned int value); }
+406	MNOSTD	BSD	{ int ksem_unlink(const char *name); }
+407	MNOSTD	BSD	{ int ksem_getvalue(semid_t id, int *val); }
+408	MNOSTD	BSD	{ int ksem_destroy(semid_t id); }
cvs diff: sys/kern/uipc_sem.c is a new entry, no comparison available
Index: sys/modules/Makefile
===================================================================
RCS file: /home/ncvs/src/sys/modules/Makefile,v
retrieving revision 1.257
diff -u -r1.257 Makefile
--- sys/modules/Makefile	16 Sep 2002 08:32:48 -0000	1.257
+++ sys/modules/Makefile	16 Sep 2002 18:39:19 -0000
@@ -69,6 +69,7 @@
 	pcn \
 	plip \
 	portalfs \
+	posix4 \
 	ppbus \
 	ppi \
 	pps \
cvs diff: sys/modules/posix4/Makefile is a new entry, no comparison available
cvs diff: sys/modules/posix4/sem/Makefile is a new entry, no comparison available
cvs diff: sys/posix4/_semaphore.h is a new entry, no comparison available
Index: sys/posix4/posix4.h
===================================================================
RCS file: /home/ncvs/src/sys/posix4/posix4.h,v
retrieving revision 1.8
diff -u -r1.8 posix4.h
--- sys/posix4/posix4.h	19 Mar 2002 22:18:09 -0000	1.8
+++ sys/posix4/posix4.h	16 Sep 2002 17:50:58 -0000
@@ -64,6 +64,7 @@
 int p31b_proc(struct proc *, pid_t, struct proc **);
 
 void p31b_setcfg(int, int);
+int p31b_getcfg(int);
 
 #ifdef _KPOSIX_PRIORITY_SCHEDULING
 
Index: sys/posix4/posix4_mib.c
===================================================================
RCS file: /home/ncvs/src/sys/posix4/posix4_mib.c,v
retrieving revision 1.4
diff -u -r1.4 posix4_mib.c
--- sys/posix4/posix4_mib.c	22 Apr 2000 15:13:06 -0000	1.4
+++ sys/posix4/posix4_mib.c	16 Sep 2002 17:49:57 -0000
@@ -92,10 +92,21 @@
 
 /* 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);
 }
 
 /*
Index: sys/sys/syscall.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/syscall.h,v
retrieving revision 1.116
diff -u -r1.116 syscall.h
--- sys/sys/syscall.h	19 Aug 2002 20:02:29 -0000	1.116
+++ sys/sys/syscall.h	16 Sep 2002 17:25:15 -0000
@@ -2,7 +2,7 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/sys/syscall.h,v 1.116 2002/08/19 20:02:29 rwatson Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.121 2002/08/19 20:01:31 rwatson Exp 
  */
 
@@ -308,4 +308,13 @@
 #define	SYS_uuidgen	392
 #define	SYS_sendfile	393
 #define	SYS_mac_syscall	394
-#define	SYS_MAXSYSCALL	395
+#define	SYS_ksem_close	400
+#define	SYS_ksem_post	401
+#define	SYS_ksem_wait	402
+#define	SYS_ksem_trywait	403
+#define	SYS_ksem_init	404
+#define	SYS_ksem_open	405
+#define	SYS_ksem_unlink	406
+#define	SYS_ksem_getvalue	407
+#define	SYS_ksem_destroy	408
+#define	SYS_MAXSYSCALL	409
Index: sys/sys/syscall.mk
===================================================================
RCS file: /home/ncvs/src/sys/sys/syscall.mk,v
retrieving revision 1.71
diff -u -r1.71 syscall.mk
--- sys/sys/syscall.mk	19 Aug 2002 20:02:29 -0000	1.71
+++ sys/sys/syscall.mk	16 Sep 2002 17:25:15 -0000
@@ -1,6 +1,6 @@
 # FreeBSD system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $FreeBSD: src/sys/sys/syscall.mk,v 1.71 2002/08/19 20:02:29 rwatson Exp $
+# $FreeBSD$
 # created from FreeBSD: src/sys/kern/syscalls.master,v 1.121 2002/08/19 20:01:31 rwatson Exp 
 MIASM =  \
 	syscall.o \
@@ -256,4 +256,13 @@
 	lchflags.o \
 	uuidgen.o \
 	sendfile.o \
-	mac_syscall.o
+	mac_syscall.o \
+	ksem_close.o \
+	ksem_post.o \
+	ksem_wait.o \
+	ksem_trywait.o \
+	ksem_init.o \
+	ksem_open.o \
+	ksem_unlink.o \
+	ksem_getvalue.o \
+	ksem_destroy.o
Index: sys/sys/sysproto.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/sysproto.h,v
retrieving revision 1.108
diff -u -r1.108 sysproto.h
--- sys/sys/sysproto.h	19 Aug 2002 20:02:29 -0000	1.108
+++ sys/sys/sysproto.h	16 Sep 2002 17:25:15 -0000
@@ -2,7 +2,7 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/sys/sysproto.h,v 1.108 2002/08/19 20:02:29 rwatson Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.121 2002/08/19 20:01:31 rwatson Exp 
  */
 
@@ -10,8 +10,8 @@
 #define	_SYS_SYSPROTO_H_
 
 #include <sys/signal.h>
-
 #include <sys/acl.h>
+#include <posix4/_semaphore.h>
 
 struct proc;
 
@@ -1124,6 +1124,39 @@
 	char call_l_[PADL_(int)]; int call; char call_r_[PADR_(int)];
 	char arg_l_[PADL_(void *)]; void * arg; char arg_r_[PADR_(void *)];
 };
+struct ksem_close_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+};
+struct ksem_post_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+};
+struct ksem_wait_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+};
+struct ksem_trywait_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+};
+struct ksem_init_args {
+	char idp_l_[PADL_(semid_t *)]; semid_t * idp; char idp_r_[PADR_(semid_t *)];
+	char value_l_[PADL_(unsigned int)]; unsigned int value; char value_r_[PADR_(unsigned int)];
+};
+struct ksem_open_args {
+	char idp_l_[PADL_(semid_t *)]; semid_t * idp; char idp_r_[PADR_(semid_t *)];
+	char name_l_[PADL_(const char *)]; const char * name; char name_r_[PADR_(const char *)];
+	char oflag_l_[PADL_(int)]; int oflag; char oflag_r_[PADR_(int)];
+	char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
+	char value_l_[PADL_(unsigned int)]; unsigned int value; char value_r_[PADR_(unsigned int)];
+};
+struct ksem_unlink_args {
+	char name_l_[PADL_(const char *)]; const char * name; char name_r_[PADR_(const char *)];
+};
+struct ksem_getvalue_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+	char val_l_[PADL_(int *)]; int * val; char val_r_[PADR_(int *)];
+};
+struct ksem_destroy_args {
+	char id_l_[PADL_(semid_t)]; semid_t id; char id_r_[PADR_(semid_t)];
+};
 int	nosys(struct thread *, struct nosys_args *);
 void	sys_exit(struct thread *, struct sys_exit_args *);
 int	fork(struct thread *, struct fork_args *);
@@ -1377,6 +1410,15 @@
 int	uuidgen(struct thread *, struct uuidgen_args *);
 int	sendfile(struct thread *, struct sendfile_args *);
 int	mac_syscall(struct thread *, struct mac_syscall_args *);
+int	ksem_close(struct thread *, struct ksem_close_args *);
+int	ksem_post(struct thread *, struct ksem_post_args *);
+int	ksem_wait(struct thread *, struct ksem_wait_args *);
+int	ksem_trywait(struct thread *, struct ksem_trywait_args *);
+int	ksem_init(struct thread *, struct ksem_init_args *);
+int	ksem_open(struct thread *, struct ksem_open_args *);
+int	ksem_unlink(struct thread *, struct ksem_unlink_args *);
+int	ksem_getvalue(struct thread *, struct ksem_getvalue_args *);
+int	ksem_destroy(struct thread *, struct ksem_destroy_args *);
 
 #ifdef COMPAT_43
 


-- 
-Alfred Perlstein [alfred@freebsd.org]
'Instead of asking why a piece of software is using "1970s technology,"
 start asking why software is ignoring 30 years of accumulated wisdom.'

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020916230854.GA86737>