<sys/sem.h>: Use generic types.
[dragonfly.git] / sys / sys / sem.h
1 /* $FreeBSD: src/sys/sys/sem.h,v 1.20.2.2 2000/08/04 22:31:10 peter Exp $ */
2 /*      $NetBSD: sem.h,v 1.5 1994/06/29 06:45:15 cgd 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 #include <sys/ipc.h>
15 #include <machine/stdint.h>
16
17 #ifndef _PID_T_DECLARED
18 typedef __pid_t         pid_t;
19 #define _PID_T_DECLARED
20 #endif
21
22 #ifndef _SIZE_T_DECLARED
23 typedef __size_t        size_t;
24 #define _SIZE_T_DECLARED
25 #endif
26
27 #ifndef _TIME_T_DECLARED
28 typedef __time_t        time_t;
29 #define _TIME_T_DECLARED
30 #endif
31
32 struct sem;
33
34 struct semid_ds {
35         struct  ipc_perm sem_perm;      /* operation permission struct */
36         struct  sem *sem_base;  /* pointer to first semaphore in set */
37         unsigned short sem_nsems;       /* number of sems in set */
38         time_t  sem_otime;      /* last operation time */
39         long    sem_pad1;       /* SVABI/386 says I need this here */
40         time_t  sem_ctime;      /* last change time */
41                                 /* Times measured in secs since */
42                                 /* 00:00:00 GMT, Jan. 1, 1970 */
43         long    sem_pad2;       /* SVABI/386 says I need this here */
44         long    sem_pad3[4];    /* SVABI/386 says I need this here */
45 };
46
47 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
48
49 #include <sys/lock.h>
50
51 struct semid_pool {
52         struct lock lk;
53         struct semid_ds ds;
54         long gen;
55 };
56
57 #endif
58
59 /*
60  * semop's sops parameter structure
61  */
62 struct sembuf {
63         unsigned short sem_num; /* semaphore # */
64         short   sem_op;         /* semaphore operation */
65         short   sem_flg;        /* operation flags */
66 };
67 #define SEM_UNDO        010000
68
69 #if __BSD_VISIBLE
70 #define MAX_SOPS        5       /* maximum # of sembuf's per semop call */
71
72 /*
73  * semctl's arg parameter structure
74  */
75 union semun {
76         int     val;            /* value for SETVAL */
77         struct  semid_ds *buf;  /* buffer for IPC_STAT & IPC_SET */
78         unsigned short  *array; /* array for GETALL & SETALL */
79 };
80 #endif /* __BSD_VISIBLE */
81
82 /*
83  * commands for semctl
84  */
85 #define GETNCNT 3       /* Return the value of semncnt {READ} */
86 #define GETPID  4       /* Return the value of sempid {READ} */
87 #define GETVAL  5       /* Return the value of semval {READ} */
88 #define GETALL  6       /* Return semvals into arg.array {READ} */
89 #define GETZCNT 7       /* Return the value of semzcnt {READ} */
90 #define SETVAL  8       /* Set the value of semval to arg.val {ALTER} */
91 #define SETALL  9       /* Set semvals from arg.array {ALTER} */
92 #if __BSD_VISIBLE
93 #define SEM_STAT 10     /* Like IPC_STAT but treats semid as sema-index */
94
95 /*
96  * Permissions
97  */
98 #define SEM_A           0200    /* alter permission */
99 #define SEM_R           0400    /* read permission */
100 #endif /* __BSD_VISIBLE */
101
102 #if defined(_KERNEL) || defined(_KERNEL_STRUCTURES)
103
104 /*
105  * semaphore info struct
106  */
107 struct seminfo {
108         int     semmap,         /* # of entries in semaphore map */
109                 semmni,         /* # of semaphore identifiers */
110                 semmns,         /* # of semaphores in system */
111                 semmnu,         /* # of undo structures in system */
112                 semmsl,         /* max # of semaphores per id */
113                 semopm,         /* max # of operations per semop call */
114                 semume,         /* max # of undo entries per process */
115                 semusz,         /* size in bytes of undo structure */
116                 semvmx,         /* semaphore maximum value */
117                 semaem;         /* adjust on exit max value */
118 };
119
120 /* internal "mode" bits */
121 #define SEM_ALLOC       01000   /* semaphore is allocated */
122 #define SEM_DEST        02000   /* semaphore will be destroyed on last detach */
123
124 #endif /* _KERNEL || _KERNEL_STRUCTURES */
125
126 #ifdef _KERNEL
127 /*
128  * Process sem_undo vectors at proc exit.
129  */
130 void    semexit(struct proc *p);
131 extern struct seminfo   seminfo;
132 #else
133 __BEGIN_DECLS
134 int     semctl(int, int, int, ...);
135 int     semget(key_t, int, int);
136 int     semop(int, struct sembuf *, unsigned);
137 __END_DECLS
138 #endif /* !_KERNEL */
139
140 #endif /* !_SEM_H_ */