| README.md | ||
| wepoll.c | ||
| wepoll.h | ||
wepoll - epoll for windows
This library implements the epoll API for Windows applications. It is fast and scalable, and it closely resembles the API and behavior of Linux' epoll.
Rationale
Unlike Linux, OS X, and many other operating systems, Windows doesn't
have a good API for receiving socket state notifications. It only
supports the select and WSAPoll APIs, but they
don't scale and suffer from
other issues.
Using I/O completion ports isn't always practical when software is designed to be cross-platform. Wepoll offers an alternative that is much closer to a drop-in replacement for software that was designed to run on Linux.
Features
- Can poll 100000s of sockets efficiently.
- Fully thread-safe.
- Multiple threads can poll the same epoll port.
- Sockets can be added to multiple epoll sets.
- All epoll events (
EPOLLIN,EPOLLOUT,EPOLLPRI,EPOLLRDHUP) are supported. - Level-triggered and one-shot (
EPOLLONESTHOT) modes are supported - Trivial to embed: you need only two files.
Limitations
- Only works with sockets.
- Edge-triggered (
EPOLLET) mode isn't supported.
How to use
The library is distributed as a single source file (wepoll.c) and a single header file (wepoll.h). Compile the .c file as part of your project, and include the header wherever needed.
Compatibility
- Requires Windows Vista or higher.
- Can be compiled with recent versions of MSVC, Clang, and GCC.
API notes
General
- The epoll port is a
HANDLE, not a file descriptor. - All functions set both
errnoandGetLastError()on failure.
epoll_create/epoll_create1
HANDLE epoll_create(int size);
HANDLE epoll_create1(int flags);
- Create a new epoll instance (port).
sizeis ignored but most be greater than zero.flagsmust be zero as there are no supported flags.- Returns
NULLon failure. - man page
epoll_close
int epoll_close(HANDLE ephnd);
- Close an epoll port.
- Do not attempt to close the epoll port with
close(),CloseHandle()orclosesocket().
epoll_ctl
int epoll_ctl(HANDLE ephnd,
int op,
SOCKET sock,
struct epoll_event* event);
- Control which socket events are monitored by an epoll port.
ephndmust be a HANDLE created byepoll_createorepoll_create1.opmust be one ofEPOLL_CTL_ADD,EPOLL_CTL_MOD,EPOLL_CTL_DEL.- It is recommended to always explicitly remove a socket from its epoll
set using
EPOLL_CTL_DELbefore closing it. As on Linux, sockets are automatically removed from the epoll set when they are closed, but wepoll may not be able to detect this until the next call toepoll_wait(). - TODO: expand
- man page
epoll_wait
int epoll_wait(HANDLE ephnd,
struct epoll_event* events,
int maxevents,
int timeout);
- Receive socket events from an epoll port.
- Returns
- -1 on failure
- 0 when a timeout occurs
- ≥1 the number of evens received
- TODO: expand
- man page