1 /*	$OpenBSD: sem.h,v 1.18 2004/07/15 11:24:46 millert Exp $	*/
2 /*	$NetBSD: sem.h,v 1.8 1996/02/09 18:25:29 christos Exp $	*/
3 
4 /*
5  * SVID compatible sem.h file
6  *
7  * Author:  Daniel Boulet
8  */
9 
10 #ifndef _SYS_SEM_H_
11 #define _SYS_SEM_H_
12 
13 #ifndef _SYS_IPC_H_
14 #include <sys/ipc.h>
15 #endif
16 #include <sys/queue.h>
17 
18 #if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)
19 
20 /* sem-specific sysctl variables corresponding to members of struct seminfo */
21 #define	KERN_SEMINFO_SEMMNI	1	/* int: # of semaphore identifiers */
22 #define	KERN_SEMINFO_SEMMNS	2	/* int: # of semaphores in system */
23 #define	KERN_SEMINFO_SEMMNU	3	/* int: # of undo structures in system */
24 #define	KERN_SEMINFO_SEMMSL	4	/* int: max semaphores per id */
25 #define	KERN_SEMINFO_SEMOPM	5	/* int: max operations per semop call */
26 #define	KERN_SEMINFO_SEMUME	6	/* int: max undo entries per process */
27 #define	KERN_SEMINFO_SEMUSZ	7	/* int: size in bytes of struct undo */
28 #define	KERN_SEMINFO_SEMVMX	8	/* int: semaphore maximum value */
29 #define	KERN_SEMINFO_SEMAEM	9	/* int: adjust on exit max value */
30 #define	KERN_SEMINFO_MAXID	10	/* number of valid semaphore sysctls */
31 
32 #define	CTL_KERN_SEMINFO_NAMES { \
33 	{ 0, 0 }, \
34 	{ "semmni", CTLTYPE_INT }, \
35 	{ "semmns", CTLTYPE_INT }, \
36 	{ "semmnu", CTLTYPE_INT }, \
37 	{ "semmsl", CTLTYPE_INT }, \
38 	{ "semopm", CTLTYPE_INT }, \
39 	{ "semume", CTLTYPE_INT }, \
40 	{ "semusz", CTLTYPE_INT }, \
41 	{ "semvmx", CTLTYPE_INT }, \
42 	{ "semaem", CTLTYPE_INT }, \
43 }
44 
45 #endif /* !_POSIX_C_SOURCE && !_XOPEN_SOURCE */
46 
47 struct sem {
48 	unsigned short	semval;		/* semaphore value */
49 	pid_t		sempid;		/* pid of last operation */
50 	unsigned short	semncnt;	/* # awaiting semval > cval */
51 	unsigned short	semzcnt;	/* # awaiting semval = 0 */
52 };
53 
54 struct semid_ds {
55 	struct ipc_perm	sem_perm;	/* operation permission struct */
56 	struct sem	*sem_base;	/* pointer to first semaphore in set */
57 	unsigned short	sem_nsems;	/* number of sems in set */
58 	time_t		sem_otime;	/* last operation time */
59 	long		sem_pad1;	/* SVABI/386 says I need this here */
60 	time_t		sem_ctime;	/* last change time */
61 	    				/* Times measured in secs since */
62 	    				/* 00:00:00 GMT, Jan. 1, 1970 */
63 	long		sem_pad2;	/* SVABI/386 says I need this here */
64 	long		sem_pad3[4];	/* SVABI/386 says I need this here */
65 };
66 
67 #ifdef _KERNEL
68 struct semid_ds23 {
69 	struct ipc_perm23 sem_perm;	/* operation permission struct */
70 	struct sem	*sem_base;	/* pointer to first semaphore in set */
71 	unsigned short	sem_nsems;	/* number of sems in set */
72 	time_t		sem_otime;	/* last operation time */
73 	long		sem_pad1;	/* SVABI/386 says I need this here */
74 	time_t		sem_ctime;	/* last change time */
75 	    				/* Times measured in secs since */
76 	    				/* 00:00:00 GMT, Jan. 1, 1970 */
77 	long		sem_pad2;	/* SVABI/386 says I need this here */
78 	long		sem_pad3[4];	/* SVABI/386 says I need this here */
79 };
80 
81 struct semid_ds35 {
82 	struct ipc_perm35 sem_perm;	/* operation permission struct */
83 	struct sem	  *sem_base;	/* pointer to first semaphore in set */
84 	unsigned short	  sem_nsems;	/* number of sems in set */
85 	time_t		  sem_otime;	/* last operation time */
86 	long		  sem_pad1;	/* SVABI/386 says I need this here */
87 	time_t		  sem_ctime;	/* last change time */
88 	    				/* Times measured in secs since */
89 	    				/* 00:00:00 GMT, Jan. 1, 1970 */
90 	long		  sem_pad2;	/* SVABI/386 says I need this here */
91 	long		  sem_pad3[4];	/* SVABI/386 says I need this here */
92 };
93 #endif
94 
95 /*
96  * semop's sops parameter structure
97  */
98 struct sembuf {
99 	unsigned short	sem_num;	/* semaphore # */
100 	short		sem_op;		/* semaphore operation */
101 	short		sem_flg;	/* operation flags */
102 };
103 #define SEM_UNDO	010000
104 
105 /*
106  * semctl's arg parameter structure
107  */
108 union semun {
109 	int		val;		/* value for SETVAL */
110 	struct semid_ds	*buf;		/* buffer for IPC_STAT & IPC_SET */
111 	unsigned short	*array;		/* array for GETALL & SETALL */
112 };
113 
114 /*
115  * commands for semctl
116  */
117 #define GETNCNT	3	/* Return the value of semncnt {READ} */
118 #define GETPID	4	/* Return the value of sempid {READ} */
119 #define GETVAL	5	/* Return the value of semval {READ} */
120 #define GETALL	6	/* Return semvals into arg.array {READ} */
121 #define GETZCNT	7	/* Return the value of semzcnt {READ} */
122 #define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
123 #define SETALL	9	/* Set semvals from arg.array {ALTER} */
124 
125 
126 /*
127  * Permissions
128  */
129 #define SEM_A		0200	/* alter permission */
130 #define SEM_R		0400	/* read permission */
131 
132 
133 #ifdef _KERNEL
134 /*
135  * Kernel implementation stuff
136  */
137 #define SEMVMX	32767		/* semaphore maximum value */
138 #define SEMAEM	16384		/* adjust on exit max value */
139 
140 /*
141  * Undo structure (one per process)
142  */
143 struct sem_undo {
144 	SLIST_ENTRY(sem_undo) un_next;	/* ptr to next active undo structure */
145 	struct	proc *un_proc;		/* owner of this structure */
146 	short	un_cnt;			/* # of active entries */
147 	struct undo {
148 		short	un_adjval;	/* adjust on exit values */
149 		short	un_num;		/* semaphore # */
150 		int	un_id;		/* semid */
151 	} un_ent[1];			/* undo entries */
152 };
153 
154 /*
155  * semaphore info struct
156  */
157 struct seminfo {
158 	int	semmni,		/* # of semaphore identifiers */
159 		semmns,		/* # of semaphores in system */
160 		semmnu,		/* # of undo structures in system */
161 		semmsl,		/* max # of semaphores per id */
162 		semopm,		/* max # of operations per semop call */
163 		semume,		/* max # of undo entries per process */
164 		semusz,		/* size in bytes of undo structure */
165 		semvmx,		/* semaphore maximum value */
166 		semaem;		/* adjust on exit max value */
167 };
168 
169 struct sem_sysctl_info {
170 	struct	seminfo seminfo;
171 	struct	semid_ds semids[1];
172 };
173 
174 extern struct seminfo	seminfo;
175 
176 /*
177  * Configuration parameters
178  */
179 #ifndef SEMMNI
180 #define SEMMNI	10		/* # of semaphore identifiers */
181 #endif
182 #ifndef SEMMNS
183 #define SEMMNS	60		/* # of semaphores in system */
184 #endif
185 #ifndef SEMUME
186 #define SEMUME	10		/* max # of undo entries per process */
187 #endif
188 #ifndef SEMMNU
189 #define SEMMNU	30		/* # of undo structures in system */
190 #endif
191 
192 /* shouldn't need tuning */
193 #ifndef SEMMSL
194 #define SEMMSL	SEMMNS		/* max # of semaphores per id */
195 #endif
196 #ifndef SEMOPM
197 #define SEMOPM	100		/* max # of operations per semop call */
198 #endif
199 
200 /* actual size of an undo structure */
201 #define SEMUSZ	(sizeof(struct sem_undo)+sizeof(struct undo)*SEMUME)
202 
203 extern struct	semid_ds **sema;	/* semaphore id list */
204 
205 #endif /* _KERNEL */
206 
207 #ifndef _KERNEL
208 #include <sys/cdefs.h>
209 
210 __BEGIN_DECLS
211 int	semctl(int, int, int, ...);
212 int	__semctl(int, int, int, union semun *);
213 int	semget(key_t, int, int);
214 int	semop(int, struct sembuf *, size_t);
215 int	semconfig(int);
216 __END_DECLS
217 #else
218 void	seminit(void);
219 void	semexit(struct proc *);
220 int	sysctl_sysvsem(int *, u_int, void *, size_t *, void *, size_t);
221 int	semctl1(struct proc *, int, int, int, union semun *, register_t *,
222 	    int (*)(const void *, void *, size_t),
223 	    int (*)(const void *, void *, size_t));
224 #endif /* !_KERNEL */
225 
226 #endif /* !_SEM_H_ */
227