d: Merge upstream dmd, druntime 4ca4140e58, phobos 454dff14d.
[official-gcc.git] / libphobos / libdruntime / core / sys / posix / aio.d
blob3a537a4a575b398dab49e85ba7ce515b751eb0c9
1 /**
2 * D header file to interface with the
3 * $(HTTP pubs.opengroup.org/onlinepubs/9699919799/basedefs/aio.h.html, Posix AIO API).
5 * Copyright: Copyright D Language Foundation 2018.
6 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7 * Authors: $(HTTPS github.com/darredevil, Alexandru Razvan Caciulescu)
8 */
9 module core.sys.posix.aio;
11 import core.stdc.config;
12 import core.sys.posix.signal;
13 import core.sys.posix.sys.types;
15 version (OSX)
16 version = Darwin;
17 else version (iOS)
18 version = Darwin;
19 else version (TVOS)
20 version = Darwin;
21 else version (WatchOS)
22 version = Darwin;
24 version (Posix):
26 extern (C):
27 @nogc:
28 nothrow:
30 version (CRuntime_Glibc)
32 import core.sys.posix.config;
34 struct aiocb
36 int aio_fildes;
37 int aio_lio_opcode;
38 int aio_reqprio;
39 void* aio_buf; //volatile
40 size_t aio_nbytes;
41 sigevent aio_sigevent;
43 aiocb* __next_prio;
44 int __abs_prio;
45 int __policy;
46 int __error_code;
47 ssize_t __return_value;
49 off_t aio_offset;
50 ubyte[32] __glibc_reserved;
53 static if (__USE_LARGEFILE64)
55 struct aiocb64
57 int aio_fildes;
58 int aio_lio_opcode;
59 int aio_reqprio;
60 void* aio_buf; //volatile
61 size_t aio_nbytes;
62 sigevent aio_sigevent;
64 aiocb* __next_prio;
65 int __abs_prio;
66 int __policy;
67 int __error_code;
68 ssize_t __return_value;
70 off_t aio_offset;
71 ubyte[32] __glibc_reserved;
75 else version (CRuntime_Bionic)
77 // Bionic does not define aiocb.
79 else version (CRuntime_Musl)
81 // https://git.musl-libc.org/cgit/musl/tree/include/aio.h
82 struct aiocb
84 int aio_fildes;
85 int aio_lio_opcode;
86 int aio_reqprio;
87 void* aio_buf; //volatile
88 size_t aio_nbytes;
89 sigevent aio_sigevent;
90 void* __td;
91 int[2] __lock;
92 int __err; //volatile
93 ssize_t __ret;
94 off_t aio_offset;
95 void* __next;
96 void* __prev;
97 ubyte[32-2*(void*).sizeof] __dummy4;
100 else version (CRuntime_UClibc)
102 // UClibc does not implement aiocb.
104 else version (Darwin)
106 struct aiocb
108 int aio_filedes;
109 off_t aio_offset;
110 void* aio_buf; // volatile
111 size_t aio_nbytes;
112 int reqprio;
113 sigevent aio_sigevent;
114 int aio_lio_opcode;
117 else version (FreeBSD)
119 struct __aiocb_private
121 long status;
122 long error;
123 void* kernelinfo;
126 struct aiocb
128 int aio_fildes;
129 off_t aio_offset;
130 void* aio_buf; // volatile
131 size_t aio_nbytes;
132 private int[2] __spare;
133 private void* _spare2__;
134 int aio_lio_opcode;
135 int aio_reqprio;
136 private __aiocb_private _aiocb_private;
137 sigevent aio_sigevent;
140 version = BSD_Posix;
142 else version (NetBSD)
144 struct aiocb
146 off_t aio_offset;
147 void* aio_buf; // volatile
148 size_t aio_nbytes;
149 int aio_fildes;
150 int aio_lio_opcode;
151 int aio_reqprio;
152 sigevent aio_sigevent;
153 private int _state;
154 private int _errno;
155 private ssize_t _retval;
158 version = BSD_Posix;
160 else version (OpenBSD)
162 // OpenBSD does not define aiocb.
164 else version (DragonFlyBSD)
166 struct aiocb
168 int aio_fildes;
169 off_t aio_offset;
170 void* aio_buf; // volatile
171 size_t aio_nbytes;
172 sigevent aio_sigevent;
173 int aio_lio_opcode;
174 int aio_reqprio;
175 private int _aio_val;
176 private int _aio_err;
179 version = BSD_Posix;
181 else version (Solaris)
183 struct aio_result_t
185 ssize_t aio_return;
186 int aio_errno;
189 struct aiocb
191 int aio_fildes;
192 void* aio_buf; // volatile
193 size_t aio_nbytes;
194 off_t aio_offset;
195 int aio_reqprio;
196 sigevent aio_sigevent;
197 int aio_lio_opcode;
198 aio_result_t aio_resultp;
199 int aio_state;
200 int[1] aio__pad;
203 else
204 static assert(false, "Unsupported platform");
206 /* Return values of cancelation function. */
207 version (CRuntime_Glibc)
209 enum
211 AIO_CANCELED,
212 AIO_NOTCANCELED,
213 AIO_ALLDONE
216 else version (CRuntime_Musl)
218 enum
220 AIO_CANCELED,
221 AIO_NOTCANCELED,
222 AIO_ALLDONE
225 else version (Darwin)
227 enum
229 AIO_ALLDONE = 0x1,
230 AIO_CANCELED = 0x2,
231 AIO_NOTCANCELED = 0x4,
234 else version (Solaris)
236 enum
238 AIO_CANCELED,
239 AIO_ALLDONE,
240 AIO_NOTCANCELED
243 else version (BSD_Posix)
245 enum
247 AIO_CANCELED,
248 AIO_NOTCANCELED,
249 AIO_ALLDONE
253 /* Operation codes for `aio_lio_opcode'. */
254 version (CRuntime_Glibc)
256 enum
258 LIO_READ,
259 LIO_WRITE,
260 LIO_NOP
263 else version (CRuntime_Musl)
265 enum
267 LIO_READ,
268 LIO_WRITE,
269 LIO_NOP
272 else version (Darwin)
274 enum
276 LIO_NOP = 0x0,
277 LIO_READ = 0x1,
278 LIO_WRITE = 0x2,
281 else version (Solaris)
283 enum
285 LIO_NOP,
286 LIO_READ,
287 LIO_WRITE,
290 else version (BSD_Posix)
292 enum
294 LIO_NOP,
295 LIO_WRITE,
296 LIO_READ
300 /* Synchronization options for `lio_listio' function. */
301 version (CRuntime_Glibc)
303 enum
305 LIO_WAIT,
306 LIO_NOWAIT
309 else version (CRuntime_Musl)
311 enum
313 LIO_WAIT,
314 LIO_NOWAIT
317 else version (Darwin)
319 enum
321 LIO_NOWAIT = 0x1,
322 LIO_WAIT = 0x2,
325 else version (Solaris)
327 enum
329 LIO_NOWAIT,
330 LIO_WAIT
333 else version (BSD_Posix)
335 enum
337 LIO_NOWAIT,
338 LIO_WAIT
342 /* Functions implementing POSIX AIO. */
343 version (CRuntime_Glibc)
345 static if (__USE_LARGEFILE64)
347 int aio_read64(aiocb64* aiocbp);
348 int aio_write64(aiocb64* aiocbp);
349 int aio_fsync64(int op, aiocb64* aiocbp);
350 int aio_error64(const(aiocb64)* aiocbp);
351 ssize_t aio_return64(aiocb64* aiocbp);
352 int aio_suspend64(const(aiocb64*)* aiocb_list, int nitems, const(timespec)* timeout);
353 int aio_cancel64(int fd, aiocb64* aiocbp);
354 int lio_listio64(int mode, const(aiocb64*)* aiocb_list, int nitems, sigevent* sevp);
356 alias aio_read = aio_read64;
357 alias aio_write = aio_write64;
358 alias aio_fsync = aio_fsync64;
359 alias aio_error = aio_error64;
360 alias aio_return = aio_return64;
361 alias aio_suspend = aio_suspend64;
362 alias aio_cancel = aio_cancel64;
363 alias lio_listio = lio_listio64;
365 else
367 int aio_read(aiocb* aiocbp);
368 int aio_write(aiocb* aiocbp);
369 int aio_fsync(int op, aiocb* aiocbp);
370 int aio_error(const(aiocb)* aiocbp);
371 ssize_t aio_return(aiocb* aiocbp);
372 int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
373 int aio_cancel(int fd, aiocb* aiocbp);
374 int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
377 else version (CRuntime_Bionic)
379 // Bionic does not implement aio.h
381 else version (CRuntime_UClibc)
383 // UClibc does not implement aio.h
385 else version (OpenBSD)
387 // OpenBSD does not implement aio.h
389 else
391 int aio_read(aiocb* aiocbp);
392 int aio_write(aiocb* aiocbp);
393 int aio_fsync(int op, aiocb* aiocbp);
394 int aio_error(const(aiocb)* aiocbp);
395 ssize_t aio_return(aiocb* aiocbp);
396 pragma(mangle, muslRedirTime64Mangle!("aio_suspend", "__aio_suspend_time64"))
397 int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
398 int aio_cancel(int fd, aiocb* aiocbp);
399 int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
402 /* Functions outside/extending POSIX requirement. */
403 version (CRuntime_Glibc)
405 static if (_GNU_SOURCE)
407 /* To customize the implementation one can use the following struct. */
408 struct aioinit
410 int aio_threads;
411 int aio_num;
412 int aio_locks;
413 int aio_usedba;
414 int aio_debug;
415 int aio_numusers;
416 int aio_idle_time;
417 int aio_reserved;
420 void aio_init(const(aioinit)* init);
423 else version (FreeBSD)
425 int aio_waitcomplete(aiocb** aiocb_list, const(timespec)* timeout);
426 int aio_mlock(aiocb* aiocbp);
428 else version (DragonFlyBSD)
430 int aio_waitcomplete(aiocb** aiocb_list, const(timespec)* timeout);