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.
This commit is contained in:
alfred 2002-09-19 00:43:32 +00:00
parent 88a3ecec6a
commit 9eba5ce05a
10 changed files with 195 additions and 4 deletions

View File

@ -115,8 +115,9 @@ s/\$//g
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

View File

@ -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.
*/

View File

@ -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); }

View File

@ -77,6 +77,7 @@ SUBDIR= 3dfx \
${_random} \
rl \
rp \
sem \
sf \
sis \
sk \

8
sys/modules/sem/Makefile Normal file
View File

@ -0,0 +1,8 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../kern
KMOD= sem
SRCS= uipc_sem.c opt_posix.h
.include <bsd.kmod.mk>

71
sys/posix4/_semaphore.h Normal file
View File

@ -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_ */

View File

@ -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

View File

@ -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.
*/

71
sys/sys/_semaphore.h Normal file
View File

@ -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_ */

View File

@ -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