mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 02:34:26 +08:00
使用wepoll iocp模拟epoll api,实现在windows下支持iocp (#1871)
This commit is contained in:
parent
b34db64961
commit
4e8c56e2be
@ -152,6 +152,23 @@ if(IOS)
|
|||||||
${ToolKit_ROOT}/Network/Socket_ios.mm)
|
${ToolKit_ROOT}/Network/Socket_ios.mm)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
#使用wepoll windows iocp 模拟 epoll
|
||||||
|
if(ENABLE_WEPOLL)
|
||||||
|
if(WIN32)
|
||||||
|
message(STATUS "Enable wepoll")
|
||||||
|
#增加wepoll源文件及api参数兼容文件
|
||||||
|
list(APPEND ToolKit_SRC_LIST
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/wepoll/wepoll.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/wepoll/sys/epoll.cpp)
|
||||||
|
#增加wepoll头文件目录
|
||||||
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/wepoll)
|
||||||
|
#开启epoll
|
||||||
|
add_definitions(-DHAS_EPOLL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
###################################################################
|
||||||
|
|
||||||
# 去除 win32 的适配代码
|
# 去除 win32 的适配代码
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
list(REMOVE_ITEM ToolKit_SRC_LIST ${ToolKit_ROOT}/win32/getopt.c)
|
list(REMOVE_ITEM ToolKit_SRC_LIST ${ToolKit_ROOT}/win32/getopt.c)
|
||||||
|
28
3rdpart/wepoll/LICENSE
Normal file
28
3rdpart/wepoll/LICENSE
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
wepoll - epoll for Windows
|
||||||
|
https://github.com/piscisaureus/wepoll
|
||||||
|
|
||||||
|
Copyright 2012-2020, Bert Belder <bertbelder@gmail.com>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in the
|
||||||
|
documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
202
3rdpart/wepoll/README.md
Normal file
202
3rdpart/wepoll/README.md
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
# wepoll - epoll for windows
|
||||||
|
|
||||||
|
[![][ci status badge]][ci status link]
|
||||||
|
|
||||||
|
This library implements the [epoll][man 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][select scale] and suffer from
|
||||||
|
[other issues][wsapoll 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
|
||||||
|
|
||||||
|
* 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][dist].
|
||||||
|
|
||||||
|
## Limitations
|
||||||
|
|
||||||
|
* Only works with sockets.
|
||||||
|
* Edge-triggered (`EPOLLET`) mode isn't supported.
|
||||||
|
|
||||||
|
## How to use
|
||||||
|
|
||||||
|
The library is [distributed][dist] as a single source file
|
||||||
|
([wepoll.c][wepoll.c]) and a single header file ([wepoll.h][wepoll.h]).<br>
|
||||||
|
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
|
||||||
|
|
||||||
|
### General remarks
|
||||||
|
|
||||||
|
* The epoll port is a `HANDLE`, not a file descriptor.
|
||||||
|
* All functions set both `errno` and `GetLastError()` on failure.
|
||||||
|
* For more extensive documentation, see the [epoll(7) man page][man epoll],
|
||||||
|
and the per-function man pages that are linked below.
|
||||||
|
|
||||||
|
### 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 greater than zero.
|
||||||
|
* `flags` must be zero as there are no supported flags.
|
||||||
|
* Returns `NULL` on failure.
|
||||||
|
* [Linux man page][man epoll_create]
|
||||||
|
|
||||||
|
### epoll_close
|
||||||
|
|
||||||
|
```c
|
||||||
|
int epoll_close(HANDLE ephnd);
|
||||||
|
```
|
||||||
|
|
||||||
|
* Close an epoll port.
|
||||||
|
* Do not attempt to close the epoll port with `close()`,
|
||||||
|
`CloseHandle()` or `closesocket()`.
|
||||||
|
|
||||||
|
### 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()`](#epoll_createepoll_create1) or
|
||||||
|
[`epoll_create1()`](#epoll_createepoll_create1).
|
||||||
|
* `op` must be one of `EPOLL_CTL_ADD`, `EPOLL_CTL_MOD`, `EPOLL_CTL_DEL`.
|
||||||
|
* `sock` must be a valid socket created by [`socket()`][msdn socket],
|
||||||
|
[`WSASocket()`][msdn wsasocket], or [`accept()`][msdn accept].
|
||||||
|
* `event` should be a pointer to a [`struct epoll_event`](#struct-epoll_event).<br>
|
||||||
|
If `op` is `EPOLL_CTL_DEL` then the `event` parameter is ignored, and it
|
||||||
|
may be `NULL`.
|
||||||
|
* Returns 0 on success, -1 on failure.
|
||||||
|
* It is recommended to always explicitly remove a socket from its epoll
|
||||||
|
set using `EPOLL_CTL_DEL` *before* closing it.<br>
|
||||||
|
As on Linux, closed sockets are automatically removed from the epoll set, but
|
||||||
|
wepoll may not be able to detect that a socket was closed until the next call
|
||||||
|
to [`epoll_wait()`](#epoll_wait).
|
||||||
|
* [Linux man page][man epoll_ctl]
|
||||||
|
|
||||||
|
### epoll_wait
|
||||||
|
|
||||||
|
```c
|
||||||
|
int epoll_wait(HANDLE ephnd,
|
||||||
|
struct epoll_event* events,
|
||||||
|
int maxevents,
|
||||||
|
int timeout);
|
||||||
|
```
|
||||||
|
|
||||||
|
* Receive socket events from an epoll port.
|
||||||
|
* `events` should point to a caller-allocated array of
|
||||||
|
[`epoll_event`](#struct-epoll_event) structs, which will receive the
|
||||||
|
reported events.
|
||||||
|
* `maxevents` is the maximum number of events that will be written to the
|
||||||
|
`events` array, and must be greater than zero.
|
||||||
|
* `timeout` specifies whether to block when no events are immediately available.
|
||||||
|
- `<0` block indefinitely
|
||||||
|
- `0` report any events that are already waiting, but don't block
|
||||||
|
- `≥1` block for at most N milliseconds
|
||||||
|
* Return value:
|
||||||
|
- `-1` an error occurred
|
||||||
|
- `0` timed out without any events to report
|
||||||
|
- `≥1` the number of events stored in the `events` buffer
|
||||||
|
* [Linux man page][man epoll_wait]
|
||||||
|
|
||||||
|
### struct epoll_event
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef union epoll_data {
|
||||||
|
void* ptr;
|
||||||
|
int fd;
|
||||||
|
uint32_t u32;
|
||||||
|
uint64_t u64;
|
||||||
|
SOCKET sock; /* Windows specific */
|
||||||
|
HANDLE hnd; /* Windows specific */
|
||||||
|
} epoll_data_t;
|
||||||
|
```
|
||||||
|
|
||||||
|
```c
|
||||||
|
struct epoll_event {
|
||||||
|
uint32_t events; /* Epoll events and flags */
|
||||||
|
epoll_data_t data; /* User data variable */
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
* The `events` field is a bit mask containing the events being
|
||||||
|
monitored/reported, and optional flags.<br>
|
||||||
|
Flags are accepted by [`epoll_ctl()`](#epoll_ctl), but they are not reported
|
||||||
|
back by [`epoll_wait()`](#epoll_wait).
|
||||||
|
* The `data` field can be used to associate application-specific information
|
||||||
|
with a socket; its value will be returned unmodified by
|
||||||
|
[`epoll_wait()`](#epoll_wait).
|
||||||
|
* [Linux man page][man epoll_ctl]
|
||||||
|
|
||||||
|
| Event | Description |
|
||||||
|
|---------------|----------------------------------------------------------------------|
|
||||||
|
| `EPOLLIN` | incoming data available, or incoming connection ready to be accepted |
|
||||||
|
| `EPOLLOUT` | ready to send data, or outgoing connection successfully established |
|
||||||
|
| `EPOLLRDHUP` | remote peer initiated graceful socket shutdown |
|
||||||
|
| `EPOLLPRI` | out-of-band data available for reading |
|
||||||
|
| `EPOLLERR` | socket error<sup>1</sup> |
|
||||||
|
| `EPOLLHUP` | socket hang-up<sup>1</sup> |
|
||||||
|
| `EPOLLRDNORM` | same as `EPOLLIN` |
|
||||||
|
| `EPOLLRDBAND` | same as `EPOLLPRI` |
|
||||||
|
| `EPOLLWRNORM` | same as `EPOLLOUT` |
|
||||||
|
| `EPOLLWRBAND` | same as `EPOLLOUT` |
|
||||||
|
| `EPOLLMSG` | never reported |
|
||||||
|
|
||||||
|
| Flag | Description |
|
||||||
|
|------------------|---------------------------|
|
||||||
|
| `EPOLLONESHOT` | report event(s) only once |
|
||||||
|
| `EPOLLET` | not supported by wepoll |
|
||||||
|
| `EPOLLEXCLUSIVE` | not supported by wepoll |
|
||||||
|
| `EPOLLWAKEUP` | not supported by wepoll |
|
||||||
|
|
||||||
|
<sup>1</sup>: the `EPOLLERR` and `EPOLLHUP` events may always be reported by
|
||||||
|
[`epoll_wait()`](#epoll_wait), regardless of the event mask that was passed to
|
||||||
|
[`epoll_ctl()`](#epoll_ctl).
|
||||||
|
|
||||||
|
|
||||||
|
[ci status badge]: https://ci.appveyor.com/api/projects/status/github/piscisaureus/wepoll?branch=master&svg=true
|
||||||
|
[ci status link]: https://ci.appveyor.com/project/piscisaureus/wepoll/branch/master
|
||||||
|
[dist]: https://github.com/piscisaureus/wepoll/tree/dist
|
||||||
|
[man epoll]: http://man7.org/linux/man-pages/man7/epoll.7.html
|
||||||
|
[man epoll_create]: http://man7.org/linux/man-pages/man2/epoll_create.2.html
|
||||||
|
[man epoll_ctl]: http://man7.org/linux/man-pages/man2/epoll_ctl.2.html
|
||||||
|
[man epoll_wait]: http://man7.org/linux/man-pages/man2/epoll_wait.2.html
|
||||||
|
[msdn accept]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
|
||||||
|
[msdn socket]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
|
||||||
|
[msdn wsasocket]: https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
|
||||||
|
[select scale]: https://daniel.haxx.se/docs/poll-vs-select.html
|
||||||
|
[wsapoll broken]: https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
|
||||||
|
[wepoll.c]: https://github.com/piscisaureus/wepoll/blob/dist/wepoll.c
|
||||||
|
[wepoll.h]: https://github.com/piscisaureus/wepoll/blob/dist/wepoll.h
|
14
3rdpart/wepoll/sys/epoll.cpp
Normal file
14
3rdpart/wepoll/sys/epoll.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The ZLToolKit project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by MIT license that can be found in the
|
||||||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
||||||
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
#include "epoll.h"
|
||||||
|
|
||||||
|
std::map<int, HANDLE> toolkit::s_wepollHandleMap;
|
||||||
|
int toolkit::s_handleIndex = 0;
|
||||||
|
std::mutex toolkit::s_handleMtx;
|
59
3rdpart/wepoll/sys/epoll.h
Normal file
59
3rdpart/wepoll/sys/epoll.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 The ZLToolKit project authors. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
|
||||||
|
*
|
||||||
|
* Use of this source code is governed by MIT license that can be found in the
|
||||||
|
* LICENSE file in the root of the source tree. All contributing project authors
|
||||||
|
* may be found in the AUTHORS file in the root of the source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ZLMEDIAKIT_EPOLL_H
|
||||||
|
#define ZLMEDIAKIT_EPOLL_H
|
||||||
|
#include "wepoll.h"
|
||||||
|
#include <map>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
// 屏蔽 EPOLLET
|
||||||
|
#define EPOLLET 0
|
||||||
|
|
||||||
|
namespace toolkit {
|
||||||
|
// 索引handle
|
||||||
|
extern std::map<int, HANDLE> s_wepollHandleMap;
|
||||||
|
extern int s_handleIndex;
|
||||||
|
extern std::mutex s_handleMtx;
|
||||||
|
// 屏蔽epoll_create epoll_ctl epoll_wait参数差异
|
||||||
|
inline int epoll_create(int size) {
|
||||||
|
HANDLE handle = ::epoll_create(size);
|
||||||
|
if (!handle) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(s_handleMtx);
|
||||||
|
int idx = ++s_handleIndex;
|
||||||
|
s_wepollHandleMap[idx] = handle;
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int epoll_ctl(int ephnd, int op, SOCKET sock, struct epoll_event *ev) {
|
||||||
|
HANDLE handle;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(s_handleMtx);
|
||||||
|
handle = s_wepollHandleMap[ephnd];
|
||||||
|
}
|
||||||
|
return ::epoll_ctl(handle, op, sock, ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int epoll_wait(int ephnd, struct epoll_event *events, int maxevents, int timeout) {
|
||||||
|
HANDLE handle;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lck(s_handleMtx);
|
||||||
|
handle = s_wepollHandleMap[ephnd];
|
||||||
|
}
|
||||||
|
return ::epoll_wait(handle, events, maxevents, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace toolkit
|
||||||
|
|
||||||
|
#endif // ZLMEDIAKIT_EPOLL_H
|
2060
3rdpart/wepoll/wepoll.c
Normal file
2060
3rdpart/wepoll/wepoll.c
Normal file
File diff suppressed because it is too large
Load Diff
107
3rdpart/wepoll/wepoll.h
Normal file
107
3rdpart/wepoll/wepoll.h
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* wepoll - epoll for Windows
|
||||||
|
* https://github.com/piscisaureus/wepoll
|
||||||
|
*
|
||||||
|
* Copyright 2012-2020, Bert Belder <bertbelder@gmail.com>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WEPOLL_H_
|
||||||
|
#define WEPOLL_H_
|
||||||
|
|
||||||
|
#ifndef WEPOLL_EXPORT
|
||||||
|
#define WEPOLL_EXPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
enum EPOLL_EVENTS {
|
||||||
|
EPOLLIN = (int)(1U << 0),
|
||||||
|
EPOLLPRI = (int)(1U << 1),
|
||||||
|
EPOLLOUT = (int)(1U << 2),
|
||||||
|
EPOLLERR = (int)(1U << 3),
|
||||||
|
EPOLLHUP = (int)(1U << 4),
|
||||||
|
EPOLLRDNORM = (int)(1U << 6),
|
||||||
|
EPOLLRDBAND = (int)(1U << 7),
|
||||||
|
EPOLLWRNORM = (int)(1U << 8),
|
||||||
|
EPOLLWRBAND = (int)(1U << 9),
|
||||||
|
EPOLLMSG = (int)(1U << 10), /* Never reported. */
|
||||||
|
EPOLLRDHUP = (int)(1U << 13),
|
||||||
|
EPOLLONESHOT = (int)(1U << 31)
|
||||||
|
};
|
||||||
|
|
||||||
|
#define EPOLLIN (1U << 0)
|
||||||
|
#define EPOLLPRI (1U << 1)
|
||||||
|
#define EPOLLOUT (1U << 2)
|
||||||
|
#define EPOLLERR (1U << 3)
|
||||||
|
#define EPOLLHUP (1U << 4)
|
||||||
|
#define EPOLLRDNORM (1U << 6)
|
||||||
|
#define EPOLLRDBAND (1U << 7)
|
||||||
|
#define EPOLLWRNORM (1U << 8)
|
||||||
|
#define EPOLLWRBAND (1U << 9)
|
||||||
|
#define EPOLLMSG (1U << 10)
|
||||||
|
#define EPOLLRDHUP (1U << 13)
|
||||||
|
#define EPOLLONESHOT (1U << 31)
|
||||||
|
|
||||||
|
#define EPOLL_CTL_ADD 1
|
||||||
|
#define EPOLL_CTL_MOD 2
|
||||||
|
#define EPOLL_CTL_DEL 3
|
||||||
|
|
||||||
|
typedef void *HANDLE;
|
||||||
|
typedef uintptr_t SOCKET;
|
||||||
|
|
||||||
|
typedef union epoll_data {
|
||||||
|
void *ptr;
|
||||||
|
int fd;
|
||||||
|
uint32_t u32;
|
||||||
|
uint64_t u64;
|
||||||
|
SOCKET sock; /* Windows specific */
|
||||||
|
HANDLE hnd; /* Windows specific */
|
||||||
|
} epoll_data_t;
|
||||||
|
|
||||||
|
struct epoll_event {
|
||||||
|
uint32_t events; /* Epoll events and flags */
|
||||||
|
epoll_data_t data; /* User data variable */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
WEPOLL_EXPORT HANDLE epoll_create(int size);
|
||||||
|
WEPOLL_EXPORT HANDLE epoll_create1(int flags);
|
||||||
|
|
||||||
|
WEPOLL_EXPORT int epoll_close(HANDLE ephnd);
|
||||||
|
|
||||||
|
WEPOLL_EXPORT int epoll_ctl(HANDLE ephnd, int op, SOCKET sock, struct epoll_event *event);
|
||||||
|
|
||||||
|
WEPOLL_EXPORT int epoll_wait(HANDLE ephnd, struct epoll_event *events, int maxevents, int timeout);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* WEPOLL_H_ */
|
@ -52,6 +52,7 @@ option(ENABLE_SRT "Enable SRT" ON)
|
|||||||
option(ENABLE_TESTS "Enable Tests" ON)
|
option(ENABLE_TESTS "Enable Tests" ON)
|
||||||
option(ENABLE_WEBRTC "Enable WebRTC" ON)
|
option(ENABLE_WEBRTC "Enable WebRTC" ON)
|
||||||
option(ENABLE_X264 "Enable x264" OFF)
|
option(ENABLE_X264 "Enable x264" OFF)
|
||||||
|
option(ENABLE_WEPOLL "Enable wepoll" OFF)
|
||||||
|
|
||||||
option(USE_SOLUTION_FOLDERS "Enable solution dir supported" ON)
|
option(USE_SOLUTION_FOLDERS "Enable solution dir supported" ON)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user