/** * D header file to interface with the Linux epoll API (http://man7.org/linux/man-pages/man7/epoll.7.html). * Available since Linux 2.6 * * Copyright: Copyright Adil Baig 2012. * License : $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) * Authors : Adil Baig (github.com/adilbaig) */ module core.sys.linux.epoll; version (linux): import core.sys.posix.signal : sigset_t; extern (C): @system: @nogc: nothrow: @system: version (ARM) version = ARM_Any; version (AArch64) version = ARM_Any; version (HPPA) version = HPPA_Any; version (MIPS32) version = MIPS_Any; version (MIPS64) version = MIPS_Any; version (PPC) version = PPC_Any; version (PPC64) version = PPC_Any; version (RISCV32) version = RISCV_Any; version (RISCV64) version = RISCV_Any; version (S390) version = IBMZ_Any; version (SPARC) version = SPARC_Any; version (SPARC64) version = SPARC_Any; version (SystemZ) version = IBMZ_Any; version (X86) version = X86_Any; version (X86_64) version = X86_Any; enum { EPOLL_CLOEXEC = 0x80000, EPOLL_NONBLOCK = 0x800 } enum { EPOLLIN = 0x001, EPOLLPRI = 0x002, EPOLLOUT = 0x004, EPOLLRDNORM = 0x040, EPOLLRDBAND = 0x080, EPOLLWRNORM = 0x100, EPOLLWRBAND = 0x200, EPOLLMSG = 0x400, EPOLLERR = 0x008, EPOLLHUP = 0x010, EPOLLRDHUP = 0x2000, // since Linux 2.6.17 EPOLLEXCLUSIVE = 1u << 28, // since Linux 4.5 EPOLLWAKEUP = 1u << 29, EPOLLONESHOT = 1u << 30, EPOLLET = 1u << 31 } /** * Valid opcodes ( "op" parameter ) to issue to epoll_ctl(). */ enum { EPOLL_CTL_ADD = 1, /// Add a file descriptor to the interface. EPOLL_CTL_DEL = 2, /// Remove a file descriptor from the interface. EPOLL_CTL_MOD = 3, /// Change file descriptor epoll_event structure. } version (X86_Any) { align(1) struct epoll_event { align(1): uint events; epoll_data_t data; } } else version (ARM_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (PPC_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (HPPA_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (MIPS_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (RISCV_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (SPARC_Any) { struct epoll_event { uint events; epoll_data_t data; } } else version (IBMZ_Any) { struct epoll_event { uint events; epoll_data_t data; } } else { static assert(false, "Platform not supported"); } union epoll_data_t { void *ptr; int fd; uint u32; ulong u64; } /** * Creates an epoll instance. * * Params: * size = a hint specifying the number of file descriptors to be associated * with the new instance. T * Returns: an fd for the new instance. The fd returned by epoll_create() should * be closed with close(). * See_also: epoll_create1 (int flags) */ int epoll_create (int size); /* Same as epoll_create but with an FLAGS parameter. The unused SIZE parameter has been dropped. */ /** * Creates an epoll instance. * * Params: * flags = a specified flag. If flags is 0, then, other than the fact that the * obsolete size argument is dropped, epoll_create1() is the same as * epoll_create(). * Returns: an fd for the new instance. The fd returned by epoll_create() should * be closed with close(). * See_also: epoll_create (int size) */ int epoll_create1 (int flags); /** * Manipulate an epoll instance * * Params: * epfd = an epoll file descriptor instance * op = one of the EPOLL_CTL_* constants * fd = target file descriptor of the operation * event = describes which events the caller is interested in and any * associated user dat * Returns: 0 in case of success, -1 in case of error ( the "errno" variable * will contain the specific error code ) */ int epoll_ctl (int epfd, int op, int fd, epoll_event *event); /** * Wait for events on an epoll instance. * * * Params: * epfd = an epoll file descriptor instance * events = a buffer that will contain triggered events * maxevents = the maximum number of events to be returned ( usually size of * "events" ) * timeout = specifies the maximum wait time in milliseconds (-1 == infinite) * * Returns: the number of triggered events returned in "events" buffer. Or -1 in * case of error with the "errno" variable set to the specific error * code. */ int epoll_wait (int epfd, epoll_event *events, int maxevents, int timeout); /** * Wait for events on an epoll instance * * * Params: * epfd = an epoll file descriptor instance * events = a buffer that will contain triggered events * maxevents = the maximum number of events to be returned ( usually size of * "events" ) * timeout = specifies the maximum wait time in milliseconds (-1 == infinite) * ss = a signal set. May be specified as `null`, in which case epoll_pwait() is * equivalent to epoll_wait(). * * Returns: the number of triggered events returned in "events" buffer. Or -1 in * case of error with the "errno" variable set to the specific error * code. */ int epoll_pwait (int epfd, epoll_event *events, int maxevents, int timeout, const sigset_t *ss);