xref: /minix/sys/sys/sem.h (revision fb4fbf7a)
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_ */
245