1 /**
2 * D header file for POSIX.
3 *
4 * Copyright: Copyright Sean Kelly 2005 - 2009.
5 * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
6 * Authors: Sean Kelly, Alex Rønne Petersen
7 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
8 */
9
10 /* Copyright Sean Kelly 2005 - 2009.
11 * Distributed under the Boost Software License, Version 1.0.
12 * (See accompanying file LICENSE or copy at
13 * http://www.boost.org/LICENSE_1_0.txt)
14 */
15 module core.sys.posix.semaphore;
16
17 import core.sys.posix.config;
18 import core.sys.posix.time;
19
20 version (OSX)
21 version = Darwin;
22 else version (iOS)
23 version = Darwin;
24 else version (TVOS)
25 version = Darwin;
26 else version (WatchOS)
27 version = Darwin;
28
29 version (Posix):
30 extern (C):
31 nothrow:
32 @nogc:
33
34 //
35 // Required
36 //
37 /*
38 sem_t
39 SEM_FAILED
40
41 int sem_close(sem_t*);
42 int sem_destroy(sem_t*);
43 int sem_getvalue(sem_t*, int*);
44 int sem_init(sem_t*, int, uint);
45 sem_t* sem_open(const scope char*, int, ...);
46 int sem_post(sem_t*);
47 int sem_trywait(sem_t*);
48 int sem_unlink(const scope char*);
49 int sem_wait(sem_t*);
50 */
51
52 version (CRuntime_Glibc)
53 {
54 private alias int __atomic_lock_t;
55
56 private struct _pthread_fastlock
57 {
58 c_long __status;
59 __atomic_lock_t __spinlock;
60 }
61
62 struct sem_t
63 {
64 _pthread_fastlock __sem_lock;
65 int __sem_value;
66 void* __sem_waiting;
67 }
68
69 enum SEM_FAILED = cast(sem_t*) null;
70 }
71 else version (Darwin)
72 {
73 alias int sem_t;
74
75 enum SEM_FAILED = cast(sem_t*) null;
76 }
77 else version (FreeBSD)
78 {
79 // FBSD-9.0 definition
80 struct sem_t
81 {
82 uint _magic;
83 struct _usem
84 {
85 shared uint _has_waiters;
86 shared uint _count;
87 uint _flags;
88 } _usem _kern;
89 }
90
91 enum SEM_FAILED = cast(sem_t*) null;
92 }
93 else version (NetBSD)
94 {
95 alias size_t sem_t;
96
97 enum SEM_FAILED = cast(sem_t*) null;
98 }
99 else version (OpenBSD)
100 {
101 struct __sem;
102 alias sem_t = __sem*;
103
104 enum SEM_FAILED = cast(sem_t*) null;
105 }
106 else version (DragonFlyBSD)
107 {
108 struct sem_t
109 {
110 uint _magic;
111 struct _usem
112 {
113 shared uint _has_waiters;
114 shared uint _count;
115 uint _flags;
116 } _usem _kern;
117 }
118
119 enum SEM_FAILED = cast(sem_t*) null;
120 }
121 else version (Solaris)
122 {
123 struct sem_t
124 {
125 uint sem_count;
126 ushort sem_type;
127 ushort sem_magic;
128 ulong[3] sem_pad1;
129 ulong[2] sem_pad2;
130 }
131
132 enum SEM_FAILED = cast(sem_t*)-1;
133 }
134 else version (CRuntime_Bionic)
135 {
136 struct sem_t
137 {
138 uint count; //volatile
139 }
140
141 enum SEM_FAILED = null;
142 }
143 else version (CRuntime_Musl)
144 {
145 struct sem_t {
146 int[4*c_long.sizeof/int.sizeof] __val;
147 }
148
149 enum SEM_FAILED = (sem_t*).init;
150 }
151 else version (CRuntime_UClibc)
152 {
153 enum __SIZEOF_SEM_T = 16;
154
155 union sem_t
156 {
157 byte[__SIZEOF_SEM_T] __size;
158 c_long __align;
159 }
160
161 enum SEM_FAILED = cast(sem_t*) null;
162 }
163 else
164 {
165 static assert(false, "Unsupported platform");
166 }
167
168 int sem_close(sem_t*);
169 int sem_destroy(sem_t*);
170 int sem_getvalue(sem_t*, int*);
171 int sem_init(sem_t*, int, uint);
172 sem_t* sem_open(const scope char*, int, ...);
173 int sem_post(sem_t*);
174 int sem_trywait(sem_t*);
175 int sem_unlink(const scope char*);
176 int sem_wait(sem_t*);
177
178 //
179 // Timeouts (TMO)
180 //
181 /*
182 int sem_timedwait(sem_t*, const scope timespec*);
183 */
184
185 version (CRuntime_Glibc)
186 {
187 int sem_timedwait(sem_t*, const scope timespec*);
188 }
189 else version (Darwin)
190 {
191 int sem_timedwait(sem_t*, const scope timespec*);
192 }
193 else version (FreeBSD)
194 {
195 int sem_timedwait(sem_t*, const scope timespec*);
196 }
197 else version (NetBSD)
198 {
199 int sem_timedwait(sem_t*, const scope timespec*);
200 }
201 else version (OpenBSD)
202 {
203 int sem_timedwait(sem_t*, const scope timespec*);
204 }
205 else version (DragonFlyBSD)
206 {
207 int sem_timedwait(sem_t*, const scope timespec*);
208 }
209 else version (Solaris)
210 {
211 int sem_timedwait(sem_t*, const scope timespec*);
212 }
213 else version (CRuntime_Bionic)
214 {
215 int sem_timedwait(sem_t*, const scope timespec*);
216 }
217 else version (CRuntime_Musl)
218 {
219 pragma(mangle, muslRedirTime64Mangle!("sem_timedwait", "__sem_timedwait_time64"))
220 int sem_timedwait(sem_t*, const scope timespec*);
221 }
222 else version (CRuntime_UClibc)
223 {
224 int sem_timedwait(sem_t*, const scope timespec*);
225 }
226 else
227 {
228 static assert(false, "Unsupported platform");
229 }