xref: /freebsd/sys/sys/sem.h (revision a353d785)
1*a353d785SJoerg Wunsch /* $Id: sem.h,v 1.6 1995/08/30 00:33:34 bde Exp $ */
23d903220SDoug Rabson /*	$NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd Exp $	*/
33d903220SDoug Rabson 
43d903220SDoug Rabson /*
53d903220SDoug Rabson  * SVID compatible sem.h file
63d903220SDoug Rabson  *
73d903220SDoug Rabson  * Author:  Daniel Boulet
83d903220SDoug Rabson  */
93d903220SDoug Rabson 
103d903220SDoug Rabson #ifndef _SYS_SEM_H_
113d903220SDoug Rabson #define _SYS_SEM_H_
123d903220SDoug Rabson 
133d903220SDoug Rabson #include <sys/ipc.h>
143d903220SDoug Rabson 
153d903220SDoug Rabson struct sem {
163d903220SDoug Rabson 	u_short	semval;		/* semaphore value */
173d903220SDoug Rabson 	pid_t	sempid;		/* pid of last operation */
183d903220SDoug Rabson 	u_short	semncnt;	/* # awaiting semval > cval */
193d903220SDoug Rabson 	u_short	semzcnt;	/* # awaiting semval = 0 */
203d903220SDoug Rabson };
213d903220SDoug Rabson 
223d903220SDoug Rabson struct semid_ds {
233d903220SDoug Rabson 	struct	ipc_perm sem_perm;	/* operation permission struct */
243d903220SDoug Rabson 	struct	sem *sem_base;	/* pointer to first semaphore in set */
253d903220SDoug Rabson 	u_short	sem_nsems;	/* number of sems in set */
263d903220SDoug Rabson 	time_t	sem_otime;	/* last operation time */
273d903220SDoug Rabson 	long	sem_pad1;	/* SVABI/386 says I need this here */
283d903220SDoug Rabson 	time_t	sem_ctime;	/* last change time */
293d903220SDoug Rabson     				/* Times measured in secs since */
303d903220SDoug Rabson     				/* 00:00:00 GMT, Jan. 1, 1970 */
313d903220SDoug Rabson 	long	sem_pad2;	/* SVABI/386 says I need this here */
323d903220SDoug Rabson 	long	sem_pad3[4];	/* SVABI/386 says I need this here */
333d903220SDoug Rabson };
343d903220SDoug Rabson 
353d903220SDoug Rabson /*
363d903220SDoug Rabson  * semop's sops parameter structure
373d903220SDoug Rabson  */
383d903220SDoug Rabson struct sembuf {
393d903220SDoug Rabson 	u_short	sem_num;	/* semaphore # */
403d903220SDoug Rabson 	short	sem_op;		/* semaphore operation */
413d903220SDoug Rabson 	short	sem_flg;	/* operation flags */
423d903220SDoug Rabson };
433d903220SDoug Rabson #define SEM_UNDO	010000
443d903220SDoug Rabson 
453d903220SDoug Rabson #define MAX_SOPS	5	/* maximum # of sembuf's per semop call */
463d903220SDoug Rabson 
473d903220SDoug Rabson /*
483d903220SDoug Rabson  * semctl's arg parameter structure
493d903220SDoug Rabson  */
503d903220SDoug Rabson union semun {
513d903220SDoug Rabson 	int	val;		/* value for SETVAL */
523d903220SDoug Rabson 	struct	semid_ds *buf;	/* buffer for IPC_STAT & IPC_SET */
533d903220SDoug Rabson 	u_short	*array;		/* array for GETALL & SETALL */
543d903220SDoug Rabson };
553d903220SDoug Rabson 
563d903220SDoug Rabson /*
573d903220SDoug Rabson  * commands for semctl
583d903220SDoug Rabson  */
593d903220SDoug Rabson #define GETNCNT	3	/* Return the value of semncnt {READ} */
603d903220SDoug Rabson #define GETPID	4	/* Return the value of sempid {READ} */
613d903220SDoug Rabson #define GETVAL	5	/* Return the value of semval {READ} */
623d903220SDoug Rabson #define GETALL	6	/* Return semvals into arg.array {READ} */
633d903220SDoug Rabson #define GETZCNT	7	/* Return the value of semzcnt {READ} */
643d903220SDoug Rabson #define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
653d903220SDoug Rabson #define SETALL	9	/* Set semvals from arg.array {ALTER} */
663d903220SDoug Rabson 
67aed5ecb7SJoerg Wunsch /*
68aed5ecb7SJoerg Wunsch  * Permissions
69aed5ecb7SJoerg Wunsch  */
70aed5ecb7SJoerg Wunsch #define SEM_A		0200	/* alter permission */
71aed5ecb7SJoerg Wunsch #define SEM_R		0400	/* read permission */
72aed5ecb7SJoerg Wunsch 
733d903220SDoug Rabson #ifdef KERNEL
743d903220SDoug Rabson /*
753d903220SDoug Rabson  * Kernel implementation stuff
763d903220SDoug Rabson  */
773d903220SDoug Rabson #define SEMVMX	32767		/* semaphore maximum value */
783d903220SDoug Rabson #define SEMAEM	16384		/* adjust on exit max value */
793d903220SDoug Rabson 
803d903220SDoug Rabson 
813d903220SDoug Rabson /*
823d903220SDoug Rabson  * Undo structure (one per process)
833d903220SDoug Rabson  */
843d903220SDoug Rabson struct sem_undo {
853d903220SDoug Rabson 	struct	sem_undo *un_next;	/* ptr to next active undo structure */
863d903220SDoug Rabson 	struct	proc *un_proc;		/* owner of this structure */
873d903220SDoug Rabson 	short	un_cnt;			/* # of active entries */
883d903220SDoug Rabson 	struct undo {
893d903220SDoug Rabson 		short	un_adjval;	/* adjust on exit values */
903d903220SDoug Rabson 		short	un_num;		/* semaphore # */
913d903220SDoug Rabson 		int	un_id;		/* semid */
923d903220SDoug Rabson 	} un_ent[1];			/* undo entries */
933d903220SDoug Rabson };
943d903220SDoug Rabson 
953d903220SDoug Rabson /*
963d903220SDoug Rabson  * semaphore info struct
973d903220SDoug Rabson  */
983d903220SDoug Rabson struct seminfo {
993d903220SDoug Rabson 	int	semmap,		/* # of entries in semaphore map */
1003d903220SDoug Rabson 		semmni,		/* # of semaphore identifiers */
1013d903220SDoug Rabson 		semmns,		/* # of semaphores in system */
1023d903220SDoug Rabson 		semmnu,		/* # of undo structures in system */
1033d903220SDoug Rabson 		semmsl,		/* max # of semaphores per id */
1043d903220SDoug Rabson 		semopm,		/* max # of operations per semop call */
1053d903220SDoug Rabson 		semume,		/* max # of undo entries per process */
1063d903220SDoug Rabson 		semusz,		/* size in bytes of undo structure */
1073d903220SDoug Rabson 		semvmx,		/* semaphore maximum value */
1083d903220SDoug Rabson 		semaem;		/* adjust on exit max value */
1093d903220SDoug Rabson };
110789668e2SDavid Greenman extern struct seminfo	seminfo;
1113d903220SDoug Rabson 
1123d903220SDoug Rabson /* internal "mode" bits */
1133d903220SDoug Rabson #define	SEM_ALLOC	01000	/* semaphore is allocated */
1143d903220SDoug Rabson #define	SEM_DEST	02000	/* semaphore will be destroyed on last detach */
1153d903220SDoug Rabson 
1163d903220SDoug Rabson /*
1173d903220SDoug Rabson  * Configuration parameters
1183d903220SDoug Rabson  */
1193d903220SDoug Rabson #ifndef SEMMNI
1203d903220SDoug Rabson #define SEMMNI	10		/* # of semaphore identifiers */
1213d903220SDoug Rabson #endif
1223d903220SDoug Rabson #ifndef SEMMNS
1233d903220SDoug Rabson #define SEMMNS	60		/* # of semaphores in system */
1243d903220SDoug Rabson #endif
1253d903220SDoug Rabson #ifndef SEMUME
1263d903220SDoug Rabson #define SEMUME	10		/* max # of undo entries per process */
1273d903220SDoug Rabson #endif
1283d903220SDoug Rabson #ifndef SEMMNU
1293d903220SDoug Rabson #define SEMMNU	30		/* # of undo structures in system */
1303d903220SDoug Rabson #endif
1313d903220SDoug Rabson 
1323d903220SDoug Rabson /* shouldn't need tuning */
1333d903220SDoug Rabson #ifndef SEMMAP
1343d903220SDoug Rabson #define SEMMAP	30		/* # of entries in semaphore map */
1353d903220SDoug Rabson #endif
1363d903220SDoug Rabson #ifndef SEMMSL
1373d903220SDoug Rabson #define SEMMSL	SEMMNS		/* max # of semaphores per id */
1383d903220SDoug Rabson #endif
1393d903220SDoug Rabson #ifndef SEMOPM
1403d903220SDoug Rabson #define SEMOPM	100		/* max # of operations per semop call */
1413d903220SDoug Rabson #endif
1423d903220SDoug Rabson 
1433d903220SDoug Rabson /* actual size of an undo structure */
1443d903220SDoug Rabson #define SEMUSZ	(sizeof(struct sem_undo)+sizeof(struct undo)*SEMUME)
1453d903220SDoug Rabson 
14628f8db14SBruce Evans extern struct semid_ds *sema;	/* semaphore id pool */
14728f8db14SBruce Evans extern struct sem *sem;		/* semaphore pool */
14828f8db14SBruce Evans extern struct map *semmap;	/* semaphore allocation map */
14928f8db14SBruce Evans extern struct sem_undo *semu_list; /* list of active undo structures */
15028f8db14SBruce Evans extern int	*semu;		/* undo structure pool */
1513d903220SDoug Rabson 
1523d903220SDoug Rabson /*
1533d903220SDoug Rabson  * Macro to find a particular sem_undo vector
1543d903220SDoug Rabson  */
1553d903220SDoug Rabson #define SEMU(ix)	((struct sem_undo *)(((long)semu)+ix * SEMUSZ))
1563d903220SDoug Rabson 
1573d903220SDoug Rabson /*
158*a353d785SJoerg Wunsch  * Process sem_undo vectors at proc exit.
159*a353d785SJoerg Wunsch  */
160*a353d785SJoerg Wunsch void	semexit __P((struct proc *p));
161*a353d785SJoerg Wunsch 
162*a353d785SJoerg Wunsch /*
1633d903220SDoug Rabson  * Parameters to the semconfig system call
1643d903220SDoug Rabson  */
1653d903220SDoug Rabson typedef enum {
1663d903220SDoug Rabson 	SEM_CONFIG_FREEZE,	/* Freeze the semaphore facility. */
1673d903220SDoug Rabson 	SEM_CONFIG_THAW		/* Thaw the semaphore facility. */
1683d903220SDoug Rabson } semconfig_ctl_t;
1693d903220SDoug Rabson #endif /* KERNEL */
1703d903220SDoug Rabson 
1713d903220SDoug Rabson #ifndef KERNEL
1723d903220SDoug Rabson #include <sys/cdefs.h>
1733d903220SDoug Rabson 
1743d903220SDoug Rabson __BEGIN_DECLS
1753d903220SDoug Rabson int semsys __P((int, ...));
1763d903220SDoug Rabson int semctl __P((int, int, int, union semun));
1773d903220SDoug Rabson int semget __P((key_t, int, int));
1783d903220SDoug Rabson int semop __P((int, struct sembuf *,unsigned));
1793d903220SDoug Rabson __END_DECLS
1803d903220SDoug Rabson #endif /* !KERNEL */
1813d903220SDoug Rabson 
1823d903220SDoug Rabson #endif /* !_SEM_H_ */
183