root/sys/sem.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */