1
2
3
4
5
6
7
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
22 #define KERN_SEMINFO_SEMMNI 1
23 #define KERN_SEMINFO_SEMMNS 2
24 #define KERN_SEMINFO_SEMMNU 3
25 #define KERN_SEMINFO_SEMMSL 4
26 #define KERN_SEMINFO_SEMOPM 5
27 #define KERN_SEMINFO_SEMUME 6
28 #define KERN_SEMINFO_SEMUSZ 7
29 #define KERN_SEMINFO_SEMVMX 8
30 #define KERN_SEMINFO_SEMAEM 9
31 #define KERN_SEMINFO_MAXID 10
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
47
48 struct sem {
49 unsigned short semval;
50 pid_t sempid;
51 unsigned short semncnt;
52 unsigned short semzcnt;
53 };
54
55 struct semid_ds {
56 struct ipc_perm sem_perm;
57 struct sem *sem_base;
58 unsigned short sem_nsems;
59 time_t sem_otime;
60 long sem_pad1;
61 time_t sem_ctime;
62
63
64 long sem_pad2;
65 long sem_pad3[4];
66 };
67
68 #ifdef _KERNEL
69 struct semid_ds23 {
70 struct ipc_perm23 sem_perm;
71 struct sem *sem_base;
72 unsigned short sem_nsems;
73 time_t sem_otime;
74 long sem_pad1;
75 time_t sem_ctime;
76
77
78 long sem_pad2;
79 long sem_pad3[4];
80 };
81
82 struct semid_ds35 {
83 struct ipc_perm35 sem_perm;
84 struct sem *sem_base;
85 unsigned short sem_nsems;
86 time_t sem_otime;
87 long sem_pad1;
88 time_t sem_ctime;
89
90
91 long sem_pad2;
92 long sem_pad3[4];
93 };
94 #endif
95
96
97
98
99 struct sembuf {
100 unsigned short sem_num;
101 short sem_op;
102 short sem_flg;
103 };
104 #define SEM_UNDO 010000
105
106
107
108
109 union semun {
110 int val;
111 struct semid_ds *buf;
112 unsigned short *array;
113 };
114
115
116
117
118 #define GETNCNT 3
119 #define GETPID 4
120 #define GETVAL 5
121 #define GETALL 6
122 #define GETZCNT 7
123 #define SETVAL 8
124 #define SETALL 9
125
126
127
128
129
130 #define SEM_A 0200
131 #define SEM_R 0400
132
133
134 #ifdef _KERNEL
135
136
137
138 #define SEMVMX 32767
139 #define SEMAEM 16384
140
141
142
143
144 struct sem_undo {
145 SLIST_ENTRY(sem_undo) un_next;
146 struct proc *un_proc;
147 short un_cnt;
148 struct undo {
149 short un_adjval;
150 short un_num;
151 int un_id;
152 } un_ent[1];
153 };
154
155
156
157
158 struct seminfo {
159 int semmni,
160 semmns,
161 semmnu,
162 semmsl,
163 semopm,
164 semume,
165 semusz,
166 semvmx,
167 semaem;
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
179
180 #ifndef SEMMNI
181 #define SEMMNI 10
182 #endif
183 #ifndef SEMMNS
184 #define SEMMNS 60
185 #endif
186 #ifndef SEMUME
187 #define SEMUME 10
188 #endif
189 #ifndef SEMMNU
190 #define SEMMNU 30
191 #endif
192
193
194 #ifndef SEMMSL
195 #define SEMMSL SEMMNS
196 #endif
197 #ifndef SEMOPM
198 #define SEMOPM 100
199 #endif
200
201
202 #define SEMUSZ (sizeof(struct sem_undo)+sizeof(struct undo)*SEMUME)
203
204 extern struct semid_ds **sema;
205
206 #endif
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
224
225 #endif