root / lab4 / .minix-src / include / sys / sem.h @ 14
History | View | Annotate | Download (7.08 KB)
1 |
/* $NetBSD: sem.h,v 1.31 2015/05/13 01:16:15 pgoyette Exp $ */
|
---|---|
2 |
|
3 |
/*-
|
4 |
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
|
9 |
* NASA Ames Research Center.
|
10 |
*
|
11 |
* Redistribution and use in source and binary forms, with or without
|
12 |
* modification, are permitted provided that the following conditions
|
13 |
* are met:
|
14 |
* 1. Redistributions of source code must retain the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer.
|
16 |
* 2. Redistributions in binary form must reproduce the above copyright
|
17 |
* notice, this list of conditions and the following disclaimer in the
|
18 |
* documentation and/or other materials provided with the distribution.
|
19 |
*
|
20 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
21 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
22 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
23 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
24 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
26 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
27 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
28 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
29 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
30 |
* POSSIBILITY OF SUCH DAMAGE.
|
31 |
*/
|
32 |
|
33 |
/*
|
34 |
* SVID compatible sem.h file
|
35 |
*
|
36 |
* Author: Daniel Boulet
|
37 |
*/
|
38 |
|
39 |
#ifndef _SYS_SEM_H_
|
40 |
#define _SYS_SEM_H_
|
41 |
|
42 |
#include <sys/featuretest.h> |
43 |
|
44 |
#include <sys/ipc.h> |
45 |
|
46 |
#ifdef _KERNEL
|
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 |
#endif /* _KERNEL */ |
54 |
|
55 |
struct semid_ds {
|
56 |
struct ipc_perm sem_perm; /* operation permission structure */ |
57 |
unsigned short sem_nsems; /* number of semaphores in set */ |
58 |
time_t sem_otime; /* last semop() time */
|
59 |
time_t sem_ctime; /* last time changed by semctl() */
|
60 |
|
61 |
/*
|
62 |
* These members are private and used only in the internal
|
63 |
* implementation of this interface.
|
64 |
*/
|
65 |
struct __sem *_sem_base; /* pointer to first semaphore in set */ |
66 |
}; |
67 |
|
68 |
/*
|
69 |
* semop's sops parameter structure
|
70 |
*/
|
71 |
struct sembuf {
|
72 |
unsigned short sem_num; /* semaphore # */ |
73 |
short sem_op; /* semaphore operation */ |
74 |
short sem_flg; /* operation flags */ |
75 |
}; |
76 |
#define SEM_UNDO 010000 /* undo changes on process exit */ |
77 |
|
78 |
/*
|
79 |
* commands for semctl
|
80 |
*/
|
81 |
#define GETNCNT 3 /* Return the value of semncnt {READ} */ |
82 |
#define GETPID 4 /* Return the value of sempid {READ} */ |
83 |
#define GETVAL 5 /* Return the value of semval {READ} */ |
84 |
#define GETALL 6 /* Return semvals into arg.array {READ} */ |
85 |
#define GETZCNT 7 /* Return the value of semzcnt {READ} */ |
86 |
#define SETVAL 8 /* Set the value of semval to arg.val {ALTER} */ |
87 |
#define SETALL 9 /* Set semvals from arg.array {ALTER} */ |
88 |
|
89 |
#if defined(_KERNEL) || defined(__minix)
|
90 |
/*
|
91 |
* Kernel implementation stuff
|
92 |
*/
|
93 |
#define SEMVMX 32767 /* semaphore maximum value */ |
94 |
#define SEMAEM 16384 /* adjust on exit max value */ |
95 |
|
96 |
/*
|
97 |
* Permissions
|
98 |
*/
|
99 |
#define SEM_A 0200 /* alter permission */ |
100 |
#define SEM_R 0400 /* read permission */ |
101 |
|
102 |
/*
|
103 |
* Undo structure (one per process)
|
104 |
*/
|
105 |
struct sem_undo_entry {
|
106 |
short un_adjval; /* adjust on exit values */ |
107 |
short un_num; /* semaphore # */ |
108 |
int un_id; /* semid */ |
109 |
}; |
110 |
|
111 |
struct sem_undo {
|
112 |
struct sem_undo *un_next; /* ptr to next active undo structure */ |
113 |
struct proc *un_proc; /* owner of this structure */ |
114 |
short un_cnt; /* # of active entries */ |
115 |
struct sem_undo_entry un_ent[1];/* undo entries */ |
116 |
}; |
117 |
#endif /* _KERNEL */ |
118 |
|
119 |
#if defined(_NETBSD_SOURCE)
|
120 |
/*
|
121 |
* semaphore info struct
|
122 |
*/
|
123 |
struct seminfo {
|
124 |
int32_t semmap; /* # of entries in semaphore map */
|
125 |
int32_t semmni; /* # of semaphore identifiers */
|
126 |
int32_t semmns; /* # of semaphores in system */
|
127 |
int32_t semmnu; /* # of undo structures in system */
|
128 |
int32_t semmsl; /* max # of semaphores per id */
|
129 |
int32_t semopm; /* max # of operations per semop call */
|
130 |
int32_t semume; /* max # of undo entries per process */
|
131 |
int32_t semusz; /* size in bytes of undo structure */
|
132 |
int32_t semvmx; /* semaphore maximum value */
|
133 |
int32_t semaem; /* adjust on exit max value */
|
134 |
}; |
135 |
|
136 |
/* Warning: 64-bit structure padding is needed here */
|
137 |
struct semid_ds_sysctl {
|
138 |
struct ipc_perm_sysctl sem_perm;
|
139 |
int16_t sem_nsems; |
140 |
int16_t pad2; |
141 |
int32_t pad3; |
142 |
time_t sem_otime; |
143 |
time_t sem_ctime; |
144 |
}; |
145 |
struct sem_sysctl_info {
|
146 |
struct seminfo seminfo;
|
147 |
struct semid_ds_sysctl semids[1]; |
148 |
}; |
149 |
|
150 |
/*
|
151 |
* Internal "mode" bits. The first of these is used by ipcs(1), and so
|
152 |
* is defined outside the kernel as well.
|
153 |
*/
|
154 |
#define SEM_ALLOC 01000 /* semaphore is allocated */ |
155 |
#endif /* !_POSIX_C_SOURCE && !_XOPEN_SOURCE */ |
156 |
|
157 |
#if defined(_KERNEL) || defined(__minix)
|
158 |
#define SEM_DEST 02000 /* semaphore will be destroyed on last detach */ |
159 |
|
160 |
/*
|
161 |
* Configuration parameters
|
162 |
*/
|
163 |
#ifndef SEMMNI
|
164 |
#define SEMMNI 10 /* # of semaphore identifiers */ |
165 |
#endif
|
166 |
#ifndef SEMMNS
|
167 |
#define SEMMNS 60 /* # of semaphores in system */ |
168 |
#endif
|
169 |
#ifndef SEMUME
|
170 |
#define SEMUME 10 /* max # of undo entries per process */ |
171 |
#endif
|
172 |
#ifndef SEMMNU
|
173 |
#define SEMMNU 30 /* # of undo structures in system */ |
174 |
#endif
|
175 |
|
176 |
/* shouldn't need tuning */
|
177 |
#ifndef SEMMAP
|
178 |
#define SEMMAP 30 /* # of entries in semaphore map */ |
179 |
#endif
|
180 |
#ifndef SEMMSL
|
181 |
#define SEMMSL SEMMNS /* max # of semaphores per id */ |
182 |
#endif
|
183 |
#ifndef SEMOPM
|
184 |
#define SEMOPM 100 /* max # of operations per semop call */ |
185 |
#endif
|
186 |
|
187 |
/* actual size of an undo structure */
|
188 |
#define SEMUSZ (sizeof(struct sem_undo)+sizeof(struct sem_undo_entry)*SEMUME) |
189 |
|
190 |
#ifndef __minix
|
191 |
/*
|
192 |
* Structures allocated in machdep.c
|
193 |
*/
|
194 |
extern struct seminfo seminfo; |
195 |
extern struct semid_ds *sema; /* semaphore id pool */ |
196 |
#endif /* !__minix */ |
197 |
|
198 |
/*
|
199 |
* Parameters to the semconfig system call
|
200 |
*/
|
201 |
#define SEM_CONFIG_FREEZE 0 /* Freeze the semaphore facility. */ |
202 |
#define SEM_CONFIG_THAW 1 /* Thaw the semaphore facility. */ |
203 |
|
204 |
#define SYSCTL_FILL_SEM(src, dst) do { \ |
205 |
SYSCTL_FILL_PERM((src).sem_perm, (dst).sem_perm); \ |
206 |
(dst).sem_nsems = (src).sem_nsems; \ |
207 |
(dst).sem_otime = (src).sem_otime; \ |
208 |
(dst).sem_ctime = (src).sem_ctime; \ |
209 |
} while (/*CONSTCOND*/ 0) |
210 |
|
211 |
#endif /* _KERNEL */ |
212 |
|
213 |
#if defined(__minix)
|
214 |
/* ipcs ctl cmds */
|
215 |
# define SEM_STAT 18 |
216 |
# define SEM_INFO 19 |
217 |
#endif /* defined(__minix) */ |
218 |
|
219 |
#ifndef _KERNEL
|
220 |
#include <sys/cdefs.h> |
221 |
|
222 |
__BEGIN_DECLS |
223 |
#ifndef __LIBC12_SOURCE__
|
224 |
int semctl(int, int, int, ...) __RENAME(__semctl50); |
225 |
#endif
|
226 |
int semget(key_t, int, int); |
227 |
int semop(int, struct sembuf *, size_t); |
228 |
#if defined(_NETBSD_SOURCE)
|
229 |
int semconfig(int); |
230 |
#endif
|
231 |
__END_DECLS |
232 |
#else
|
233 |
void seminit(void); |
234 |
int semfini(void); |
235 |
void semexit(struct proc *, void *); |
236 |
|
237 |
int semctl1(struct lwp *, int, int, int, void *, register_t *); |
238 |
#define get_semctl_arg(cmd, sembuf, arg) \
|
239 |
((cmd) == IPC_SET || (cmd) == IPC_STAT ? (void *)sembuf \
|
240 |
: (cmd) == GETALL || (cmd) == SETVAL || (cmd) == SETALL ? (void *)arg \
|
241 |
: NULL)
|
242 |
#endif /* !_KERNEL */ |
243 |
|
244 |
#endif /* !_SYS_SEM_H_ */ |