Projet_SETI_RISC-V/riscv-gnu-toolchain/gcc/libphobos/libdruntime/core/sys/posix/aio.d
2023-03-06 14:48:14 +01:00

431 lines
8.6 KiB
D

/**
* D header file to interface with the
* $(HTTP pubs.opengroup.org/onlinepubs/9699919799/basedefs/aio.h.html, Posix AIO API).
*
* Copyright: Copyright D Language Foundation 2018.
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
* Authors: $(HTTPS github.com/darredevil, Alexandru Razvan Caciulescu)
*/
module core.sys.posix.aio;
import core.sys.posix.signal;
import core.sys.posix.sys.types;
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (Posix):
extern (C):
@system:
@nogc:
nothrow:
version (CRuntime_Glibc)
{
import core.sys.posix.config;
struct aiocb
{
int aio_fildes;
int aio_lio_opcode;
int aio_reqprio;
void* aio_buf; //volatile
size_t aio_nbytes;
sigevent aio_sigevent;
aiocb* __next_prio;
int __abs_prio;
int __policy;
int __error_code;
ssize_t __return_value;
off_t aio_offset;
ubyte[32] __glibc_reserved;
}
static if (__USE_LARGEFILE64)
{
struct aiocb64
{
int aio_fildes;
int aio_lio_opcode;
int aio_reqprio;
void* aio_buf; //volatile
size_t aio_nbytes;
sigevent aio_sigevent;
aiocb* __next_prio;
int __abs_prio;
int __policy;
int __error_code;
ssize_t __return_value;
off_t aio_offset;
ubyte[32] __glibc_reserved;
}
}
}
else version (CRuntime_Bionic)
{
// Bionic does not define aiocb.
}
else version (CRuntime_Musl)
{
// https://git.musl-libc.org/cgit/musl/tree/include/aio.h
struct aiocb
{
int aio_fildes;
int aio_lio_opcode;
int aio_reqprio;
void* aio_buf; //volatile
size_t aio_nbytes;
sigevent aio_sigevent;
void* __td;
int[2] __lock;
int __err; //volatile
ssize_t __ret;
off_t aio_offset;
void* __next;
void* __prev;
ubyte[32-2*(void*).sizeof] __dummy4;
}
}
else version (CRuntime_UClibc)
{
// UClibc does not implement aiocb.
}
else version (Darwin)
{
struct aiocb
{
int aio_filedes;
off_t aio_offset;
void* aio_buf; // volatile
size_t aio_nbytes;
int reqprio;
sigevent aio_sigevent;
int aio_lio_opcode;
}
}
else version (FreeBSD)
{
struct __aiocb_private
{
long status;
long error;
void* kernelinfo;
}
struct aiocb
{
int aio_fildes;
off_t aio_offset;
void* aio_buf; // volatile
size_t aio_nbytes;
private int[2] __spare;
private void* _spare2__;
int aio_lio_opcode;
int aio_reqprio;
private __aiocb_private _aiocb_private;
sigevent aio_sigevent;
}
version = BSD_Posix;
}
else version (NetBSD)
{
struct aiocb
{
off_t aio_offset;
void* aio_buf; // volatile
size_t aio_nbytes;
int aio_fildes;
int aio_lio_opcode;
int aio_reqprio;
sigevent aio_sigevent;
private int _state;
private int _errno;
private ssize_t _retval;
}
version = BSD_Posix;
}
else version (OpenBSD)
{
// OpenBSD does not define aiocb.
}
else version (DragonFlyBSD)
{
struct aiocb
{
int aio_fildes;
off_t aio_offset;
void* aio_buf; // volatile
size_t aio_nbytes;
sigevent aio_sigevent;
int aio_lio_opcode;
int aio_reqprio;
private int _aio_val;
private int _aio_err;
}
version = BSD_Posix;
}
else version (Solaris)
{
struct aio_result_t
{
ssize_t aio_return;
int aio_errno;
}
struct aiocb
{
int aio_fildes;
void* aio_buf; // volatile
size_t aio_nbytes;
off_t aio_offset;
int aio_reqprio;
sigevent aio_sigevent;
int aio_lio_opcode;
aio_result_t aio_resultp;
int aio_state;
int[1] aio__pad;
}
}
else
static assert(false, "Unsupported platform");
/* Return values of cancelation function. */
version (CRuntime_Glibc)
{
enum
{
AIO_CANCELED,
AIO_NOTCANCELED,
AIO_ALLDONE
}
}
else version (CRuntime_Musl)
{
enum
{
AIO_CANCELED,
AIO_NOTCANCELED,
AIO_ALLDONE
}
}
else version (Darwin)
{
enum
{
AIO_ALLDONE = 0x1,
AIO_CANCELED = 0x2,
AIO_NOTCANCELED = 0x4,
}
}
else version (Solaris)
{
enum
{
AIO_CANCELED,
AIO_ALLDONE,
AIO_NOTCANCELED
}
}
else version (BSD_Posix)
{
enum
{
AIO_CANCELED,
AIO_NOTCANCELED,
AIO_ALLDONE
}
}
/* Operation codes for `aio_lio_opcode'. */
version (CRuntime_Glibc)
{
enum
{
LIO_READ,
LIO_WRITE,
LIO_NOP
}
}
else version (CRuntime_Musl)
{
enum
{
LIO_READ,
LIO_WRITE,
LIO_NOP
}
}
else version (Darwin)
{
enum
{
LIO_NOP = 0x0,
LIO_READ = 0x1,
LIO_WRITE = 0x2,
}
}
else version (Solaris)
{
enum
{
LIO_NOP,
LIO_READ,
LIO_WRITE,
}
}
else version (BSD_Posix)
{
enum
{
LIO_NOP,
LIO_WRITE,
LIO_READ
}
}
/* Synchronization options for `lio_listio' function. */
version (CRuntime_Glibc)
{
enum
{
LIO_WAIT,
LIO_NOWAIT
}
}
else version (CRuntime_Musl)
{
enum
{
LIO_WAIT,
LIO_NOWAIT
}
}
else version (Darwin)
{
enum
{
LIO_NOWAIT = 0x1,
LIO_WAIT = 0x2,
}
}
else version (Solaris)
{
enum
{
LIO_NOWAIT,
LIO_WAIT
}
}
else version (BSD_Posix)
{
enum
{
LIO_NOWAIT,
LIO_WAIT
}
}
/* Functions implementing POSIX AIO. */
version (CRuntime_Glibc)
{
static if (__USE_LARGEFILE64)
{
int aio_read64(aiocb64* aiocbp);
int aio_write64(aiocb64* aiocbp);
int aio_fsync64(int op, aiocb64* aiocbp);
int aio_error64(const(aiocb64)* aiocbp);
ssize_t aio_return64(aiocb64* aiocbp);
int aio_suspend64(const(aiocb64*)* aiocb_list, int nitems, const(timespec)* timeout);
int aio_cancel64(int fd, aiocb64* aiocbp);
int lio_listio64(int mode, const(aiocb64*)* aiocb_list, int nitems, sigevent* sevp);
alias aio_read = aio_read64;
alias aio_write = aio_write64;
alias aio_fsync = aio_fsync64;
alias aio_error = aio_error64;
alias aio_return = aio_return64;
alias aio_suspend = aio_suspend64;
alias aio_cancel = aio_cancel64;
alias lio_listio = lio_listio64;
}
else
{
int aio_read(aiocb* aiocbp);
int aio_write(aiocb* aiocbp);
int aio_fsync(int op, aiocb* aiocbp);
int aio_error(const(aiocb)* aiocbp);
ssize_t aio_return(aiocb* aiocbp);
int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
int aio_cancel(int fd, aiocb* aiocbp);
int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
}
}
else version (CRuntime_Bionic)
{
// Bionic does not implement aio.h
}
else version (CRuntime_UClibc)
{
// UClibc does not implement aio.h
}
else version (OpenBSD)
{
// OpenBSD does not implement aio.h
}
else
{
int aio_read(aiocb* aiocbp);
int aio_write(aiocb* aiocbp);
int aio_fsync(int op, aiocb* aiocbp);
int aio_error(const(aiocb)* aiocbp);
ssize_t aio_return(aiocb* aiocbp);
int aio_suspend(const(aiocb*)* aiocb_list, int nitems, const(timespec)* timeout);
int aio_cancel(int fd, aiocb* aiocbp);
int lio_listio(int mode, const(aiocb*)* aiocb_list, int nitems, sigevent* sevp);
}
/* Functions outside/extending POSIX requirement. */
version (CRuntime_Glibc)
{
static if (_GNU_SOURCE)
{
/* To customize the implementation one can use the following struct. */
struct aioinit
{
int aio_threads;
int aio_num;
int aio_locks;
int aio_usedba;
int aio_debug;
int aio_numusers;
int aio_idle_time;
int aio_reserved;
}
void aio_init(const(aioinit)* init);
}
}
else version (FreeBSD)
{
int aio_waitcomplete(aiocb** aiocb_list, const(timespec)* timeout);
int aio_mlock(aiocb* aiocbp);
}
else version (DragonFlyBSD)
{
int aio_waitcomplete(aiocb** aiocb_list, const(timespec)* timeout);
}