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)
9 module core
.sys
.posix
.aio
;
11 import core
.stdc
.config
;
12 import core
.sys
.posix
.signal
;
13 import core
.sys
.posix
.sys
.types
;
21 else version (WatchOS
)
30 version (CRuntime_Glibc
)
32 import core
.sys
.posix
.config
;
39 void* aio_buf
; //volatile
41 sigevent aio_sigevent
;
47 ssize_t __return_value
;
50 ubyte[32] __glibc_reserved
;
53 static if (__USE_LARGEFILE64
)
60 void* aio_buf
; //volatile
62 sigevent aio_sigevent
;
68 ssize_t __return_value
;
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
87 void* aio_buf
; //volatile
89 sigevent aio_sigevent
;
97 ubyte[32-2*(void*).sizeof
] __dummy4
;
100 else version (CRuntime_UClibc
)
102 // UClibc does not implement aiocb.
104 else version (Darwin
)
110 void* aio_buf
; // volatile
113 sigevent aio_sigevent
;
117 else version (FreeBSD
)
119 struct __aiocb_private
130 void* aio_buf
; // volatile
132 private int[2] __spare
;
133 private void* _spare2__
;
136 private __aiocb_private _aiocb_private
;
137 sigevent aio_sigevent
;
142 else version (NetBSD
)
147 void* aio_buf
; // volatile
152 sigevent aio_sigevent
;
155 private ssize_t _retval
;
160 else version (OpenBSD
)
162 // OpenBSD does not define aiocb.
164 else version (DragonFlyBSD
)
170 void* aio_buf
; // volatile
172 sigevent aio_sigevent
;
175 private int _aio_val
;
176 private int _aio_err
;
181 else version (Solaris
)
192 void* aio_buf
; // volatile
196 sigevent aio_sigevent
;
198 aio_result_t aio_resultp
;
204 static assert(false, "Unsupported platform");
206 /* Return values of cancelation function. */
207 version (CRuntime_Glibc
)
216 else version (CRuntime_Musl
)
225 else version (Darwin
)
231 AIO_NOTCANCELED
= 0x4,
234 else version (Solaris
)
243 else version (BSD_Posix
)
253 /* Operation codes for `aio_lio_opcode'. */
254 version (CRuntime_Glibc
)
263 else version (CRuntime_Musl
)
272 else version (Darwin
)
281 else version (Solaris
)
290 else version (BSD_Posix
)
300 /* Synchronization options for `lio_listio' function. */
301 version (CRuntime_Glibc
)
309 else version (CRuntime_Musl
)
317 else version (Darwin
)
325 else version (Solaris
)
333 else version (BSD_Posix
)
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
;
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
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. */
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
);