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