diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /include/linux/sem.h |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'include/linux/sem.h')
-rw-r--r-- | include/linux/sem.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/include/linux/sem.h b/include/linux/sem.h new file mode 100644 index 000000000000..2d8516be9fd7 --- /dev/null +++ b/include/linux/sem.h | |||
@@ -0,0 +1,157 @@ | |||
1 | #ifndef _LINUX_SEM_H | ||
2 | #define _LINUX_SEM_H | ||
3 | |||
4 | #include <linux/ipc.h> | ||
5 | #include <asm/atomic.h> | ||
6 | |||
7 | /* semop flags */ | ||
8 | #define SEM_UNDO 0x1000 /* undo the operation on exit */ | ||
9 | |||
10 | /* semctl Command Definitions. */ | ||
11 | #define GETPID 11 /* get sempid */ | ||
12 | #define GETVAL 12 /* get semval */ | ||
13 | #define GETALL 13 /* get all semval's */ | ||
14 | #define GETNCNT 14 /* get semncnt */ | ||
15 | #define GETZCNT 15 /* get semzcnt */ | ||
16 | #define SETVAL 16 /* set semval */ | ||
17 | #define SETALL 17 /* set all semval's */ | ||
18 | |||
19 | /* ipcs ctl cmds */ | ||
20 | #define SEM_STAT 18 | ||
21 | #define SEM_INFO 19 | ||
22 | |||
23 | /* Obsolete, used only for backwards compatibility and libc5 compiles */ | ||
24 | struct semid_ds { | ||
25 | struct ipc_perm sem_perm; /* permissions .. see ipc.h */ | ||
26 | __kernel_time_t sem_otime; /* last semop time */ | ||
27 | __kernel_time_t sem_ctime; /* last change time */ | ||
28 | struct sem *sem_base; /* ptr to first semaphore in array */ | ||
29 | struct sem_queue *sem_pending; /* pending operations to be processed */ | ||
30 | struct sem_queue **sem_pending_last; /* last pending operation */ | ||
31 | struct sem_undo *undo; /* undo requests on this array */ | ||
32 | unsigned short sem_nsems; /* no. of semaphores in array */ | ||
33 | }; | ||
34 | |||
35 | /* Include the definition of semid64_ds */ | ||
36 | #include <asm/sembuf.h> | ||
37 | |||
38 | /* semop system calls takes an array of these. */ | ||
39 | struct sembuf { | ||
40 | unsigned short sem_num; /* semaphore index in array */ | ||
41 | short sem_op; /* semaphore operation */ | ||
42 | short sem_flg; /* operation flags */ | ||
43 | }; | ||
44 | |||
45 | /* arg for semctl system calls. */ | ||
46 | union semun { | ||
47 | int val; /* value for SETVAL */ | ||
48 | struct semid_ds __user *buf; /* buffer for IPC_STAT & IPC_SET */ | ||
49 | unsigned short __user *array; /* array for GETALL & SETALL */ | ||
50 | struct seminfo __user *__buf; /* buffer for IPC_INFO */ | ||
51 | void __user *__pad; | ||
52 | }; | ||
53 | |||
54 | struct seminfo { | ||
55 | int semmap; | ||
56 | int semmni; | ||
57 | int semmns; | ||
58 | int semmnu; | ||
59 | int semmsl; | ||
60 | int semopm; | ||
61 | int semume; | ||
62 | int semusz; | ||
63 | int semvmx; | ||
64 | int semaem; | ||
65 | }; | ||
66 | |||
67 | #define SEMMNI 128 /* <= IPCMNI max # of semaphore identifiers */ | ||
68 | #define SEMMSL 250 /* <= 8 000 max num of semaphores per id */ | ||
69 | #define SEMMNS (SEMMNI*SEMMSL) /* <= INT_MAX max # of semaphores in system */ | ||
70 | #define SEMOPM 32 /* <= 1 000 max num of ops per semop call */ | ||
71 | #define SEMVMX 32767 /* <= 32767 semaphore maximum value */ | ||
72 | #define SEMAEM SEMVMX /* adjust on exit max value */ | ||
73 | |||
74 | /* unused */ | ||
75 | #define SEMUME SEMOPM /* max num of undo entries per process */ | ||
76 | #define SEMMNU SEMMNS /* num of undo structures system wide */ | ||
77 | #define SEMMAP SEMMNS /* # of entries in semaphore map */ | ||
78 | #define SEMUSZ 20 /* sizeof struct sem_undo */ | ||
79 | |||
80 | #ifdef __KERNEL__ | ||
81 | |||
82 | /* One semaphore structure for each semaphore in the system. */ | ||
83 | struct sem { | ||
84 | int semval; /* current value */ | ||
85 | int sempid; /* pid of last operation */ | ||
86 | }; | ||
87 | |||
88 | /* One sem_array data structure for each set of semaphores in the system. */ | ||
89 | struct sem_array { | ||
90 | struct kern_ipc_perm sem_perm; /* permissions .. see ipc.h */ | ||
91 | time_t sem_otime; /* last semop time */ | ||
92 | time_t sem_ctime; /* last change time */ | ||
93 | struct sem *sem_base; /* ptr to first semaphore in array */ | ||
94 | struct sem_queue *sem_pending; /* pending operations to be processed */ | ||
95 | struct sem_queue **sem_pending_last; /* last pending operation */ | ||
96 | struct sem_undo *undo; /* undo requests on this array */ | ||
97 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
98 | }; | ||
99 | |||
100 | /* One queue for each sleeping process in the system. */ | ||
101 | struct sem_queue { | ||
102 | struct sem_queue * next; /* next entry in the queue */ | ||
103 | struct sem_queue ** prev; /* previous entry in the queue, *(q->prev) == q */ | ||
104 | struct task_struct* sleeper; /* this process */ | ||
105 | struct sem_undo * undo; /* undo structure */ | ||
106 | int pid; /* process id of requesting process */ | ||
107 | int status; /* completion status of operation */ | ||
108 | struct sem_array * sma; /* semaphore array for operations */ | ||
109 | int id; /* internal sem id */ | ||
110 | struct sembuf * sops; /* array of pending operations */ | ||
111 | int nsops; /* number of operations */ | ||
112 | int alter; /* does the operation alter the array? */ | ||
113 | }; | ||
114 | |||
115 | /* Each task has a list of undo requests. They are executed automatically | ||
116 | * when the process exits. | ||
117 | */ | ||
118 | struct sem_undo { | ||
119 | struct sem_undo * proc_next; /* next entry on this process */ | ||
120 | struct sem_undo * id_next; /* next entry on this semaphore set */ | ||
121 | int semid; /* semaphore set identifier */ | ||
122 | short * semadj; /* array of adjustments, one per semaphore */ | ||
123 | }; | ||
124 | |||
125 | /* sem_undo_list controls shared access to the list of sem_undo structures | ||
126 | * that may be shared among all a CLONE_SYSVSEM task group. | ||
127 | */ | ||
128 | struct sem_undo_list { | ||
129 | atomic_t refcnt; | ||
130 | spinlock_t lock; | ||
131 | struct sem_undo *proc_list; | ||
132 | }; | ||
133 | |||
134 | struct sysv_sem { | ||
135 | struct sem_undo_list *undo_list; | ||
136 | }; | ||
137 | |||
138 | #ifdef CONFIG_SYSVIPC | ||
139 | |||
140 | extern int copy_semundo(unsigned long clone_flags, struct task_struct *tsk); | ||
141 | extern void exit_sem(struct task_struct *tsk); | ||
142 | |||
143 | #else | ||
144 | static inline int copy_semundo(unsigned long clone_flags, struct task_struct *tsk) | ||
145 | { | ||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | static inline void exit_sem(struct task_struct *tsk) | ||
150 | { | ||
151 | return; | ||
152 | } | ||
153 | #endif | ||
154 | |||
155 | #endif /* __KERNEL__ */ | ||
156 | |||
157 | #endif /* _LINUX_SEM_H */ | ||