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