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