version 1.0.1
This commit is contained in:
commit
b8d89608a4
91
README.md
91
README.md
@ -9,20 +9,30 @@ Linux API and as closely as possible.
|
|||||||
|
|
||||||
Unlike Linux, OS X, and many other operating systems, Windows doesn't
|
Unlike Linux, OS X, and many other operating systems, Windows doesn't
|
||||||
have a good API for receiving socket state notifications. It only
|
have a good API for receiving socket state notifications. It only
|
||||||
supports the `select` and `WSAPoll` APIs, but they suffer from
|
supports the `select` and `WSAPoll` APIs, but they
|
||||||
well-understood scalability issues. Using I/O completion ports isn't
|
[don't scale](https://daniel.haxx.se/docs/poll-vs-select.html)
|
||||||
always practical when software is designed to be cross-platform.
|
and suffer from
|
||||||
|
[other issues](https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/).
|
||||||
|
|
||||||
|
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
|
## Features
|
||||||
|
|
||||||
* poll 100000s of sockets, efficiently
|
* can poll 100000s of sockets efficiently
|
||||||
* fully thread safe, multiple threads can poll the same epoll instance
|
* fully thread safe
|
||||||
|
* multiple threads can poll the same epoll port
|
||||||
* sockets can be added to multiple epoll sets
|
* sockets can be added to multiple epoll sets
|
||||||
|
* polling for `EPOLLIN`, `EPOLLOUT`, `EPOLLPRI`, `EPOLLRDHUP`,
|
||||||
|
`EPOLLHUP`, and `EPOLLERR` events
|
||||||
|
* `EPOLLONESTHOT` flag
|
||||||
|
|
||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
* only works on sockets (pipes, TTYs not supported)
|
* only works with sockets
|
||||||
* the EPOLLEXCLUSIVE flag isn't supported
|
* some modes not suported: `EPOLLET`, `EPOLLEXCLUSIVE`
|
||||||
|
|
||||||
## How to use
|
## How to use
|
||||||
|
|
||||||
@ -33,9 +43,68 @@ project, and include the header wherever needed.
|
|||||||
## Compatibility
|
## Compatibility
|
||||||
|
|
||||||
* Requires Windows 7 or higher.
|
* Requires Windows 7 or higher.
|
||||||
* Can be compiled with recent versions of MSVC and clang.
|
* Can be compiled with recent versions of MSVC and Clang.
|
||||||
GCC (mingw) should work, but is untested.
|
* GCC (mingw) should work (but is untested).
|
||||||
|
|
||||||
## Compatibility notes
|
## API notes
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
* The epoll port is a `HANDLE`, not a file descriptor.
|
||||||
|
* All functions set both `errno` and `GetLastError()` on failure.
|
||||||
|
|
||||||
|
### epoll_create/epoll_create1
|
||||||
|
|
||||||
|
```c
|
||||||
|
HANDLE epoll_create(int size);
|
||||||
|
HANDLE epoll_create1(int flags);
|
||||||
|
```
|
||||||
|
|
||||||
|
* Create a new epoll instance (port).
|
||||||
|
* `size` is ignored but most be nonzero.
|
||||||
|
* `flags` must be zero as there are no supported flags.
|
||||||
|
* Returns `INVALID_HANDLE_VALUE` on failure.
|
||||||
|
* [man page](http://man7.org/linux/man-pages/man2/epoll_create.2.html)
|
||||||
|
|
||||||
|
### epoll_close
|
||||||
|
|
||||||
|
```c
|
||||||
|
int epoll_close(HANDLE ephnd);
|
||||||
|
```
|
||||||
|
|
||||||
|
* Close an epoll port.
|
||||||
|
* do not attempt to close the epoll port with Windows' `close`,
|
||||||
|
`CloseHandle` or `closesocket` functions.
|
||||||
|
|
||||||
|
### epoll_ctl
|
||||||
|
|
||||||
|
```c
|
||||||
|
int epoll_ctl(HANDLE ephnd,
|
||||||
|
int op,
|
||||||
|
SOCKET sock,
|
||||||
|
struct epoll_event* event);
|
||||||
|
```
|
||||||
|
|
||||||
|
* Control which socket events are monitored by an epoll port.
|
||||||
|
* `ephnd` must be a HANDLE created by `epoll_create` or `epoll_create1`.
|
||||||
|
* `op` must be one of `EPOLL_CTL_ADD`, `EPOLL_CTL_MOD`, `EPOLL_CTL_DEL`.
|
||||||
|
* TODO: expand
|
||||||
|
* [man page](http://man7.org/linux/man-pages/man2/epoll_ctl.2.html)
|
||||||
|
|
||||||
|
### epoll_wait
|
||||||
|
|
||||||
|
```c
|
||||||
|
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
|
||||||
|
- \>0 the number of evens received
|
||||||
|
* TODO: expand
|
||||||
|
* [man page](http://man7.org/linux/man-pages/man2/epoll_wait.2.html)
|
||||||
|
|
||||||
**TODO**
|
|
||||||
|
|||||||
1
wepoll.c
1
wepoll.c
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* wepoll - epoll for Windows
|
||||||
* Copyright 2012-2017, Bert Belder. All rights reserved.
|
* Copyright 2012-2017, Bert Belder. All rights reserved.
|
||||||
*
|
*
|
||||||
* The red-black tree implementation:
|
* The red-black tree implementation:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user