zapret/tpws/epoll-shim/src/epollfd_ctx.h
2021-03-04 14:30:38 +03:00

109 lines
2.1 KiB
C

#ifndef EPOLLFD_CTX_H_
#define EPOLLFD_CTX_H_
#include "fix.h"
#define SHIM_SYS_SHIM_HELPERS
#include <sys/epoll.h>
#include <sys/queue.h>
#include <sys/tree.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <poll.h>
#include <pthread.h>
struct registered_fds_node_;
typedef struct registered_fds_node_ RegisteredFDsNode;
typedef enum {
EOF_STATE_READ_EOF = 0x01,
EOF_STATE_WRITE_EOF = 0x02,
} EOFState;
typedef enum {
NODE_TYPE_FIFO = 1,
NODE_TYPE_SOCKET = 2,
NODE_TYPE_KQUEUE = 3,
NODE_TYPE_OTHER = 4,
NODE_TYPE_POLL = 5,
} NodeType;
struct registered_fds_node_ {
RB_ENTRY(registered_fds_node_) entry;
TAILQ_ENTRY(registered_fds_node_) pollfd_list_entry;
int fd;
epoll_data_t data;
bool is_registered;
bool has_evfilt_read;
bool has_evfilt_write;
bool has_evfilt_except;
bool got_evfilt_read;
bool got_evfilt_write;
bool got_evfilt_except;
NodeType node_type;
union {
struct {
bool readable;
bool writable;
} fifo;
} node_data;
int eof_state;
bool pollpri_active;
uint16_t events;
uint32_t revents;
bool is_edge_triggered;
bool is_oneshot;
bool is_on_pollfd_list;
int self_pipe[2];
};
typedef TAILQ_HEAD(pollfds_list_, registered_fds_node_) PollFDList;
typedef RB_HEAD(registered_fds_set_, registered_fds_node_) RegisteredFDsSet;
typedef struct {
int kq; // non owning
pthread_mutex_t mutex;
PollFDList poll_fds;
size_t poll_fds_size;
RegisteredFDsSet registered_fds;
size_t registered_fds_size;
struct kevent *kevs;
size_t kevs_length;
struct pollfd *pfds;
size_t pfds_length;
pthread_mutex_t nr_polling_threads_mutex;
pthread_cond_t nr_polling_threads_cond;
unsigned long nr_polling_threads;
int self_pipe[2];
} EpollFDCtx;
errno_t epollfd_ctx_init(EpollFDCtx *epollfd, int kq);
errno_t epollfd_ctx_terminate(EpollFDCtx *epollfd);
void epollfd_ctx_fill_pollfds(EpollFDCtx *epollfd, struct pollfd *pfds);
errno_t epollfd_ctx_ctl(EpollFDCtx *epollfd, int op, int fd2,
struct epoll_event *ev);
errno_t epollfd_ctx_wait(EpollFDCtx *epollfd, struct epoll_event *ev, int cnt,
int *actual_cnt);
#endif