diff options
Diffstat (limited to 'src/fdevent.h')
-rw-r--r-- | src/fdevent.h | 74 |
1 files changed, 27 insertions, 47 deletions
diff --git a/src/fdevent.h b/src/fdevent.h index 601acf1..5f813d6 100644 --- a/src/fdevent.h +++ b/src/fdevent.h @@ -32,10 +32,6 @@ # else # include <sys/poll.h> # endif -# if defined HAVE_SIGTIMEDWAIT && defined(__linux__) -# define USE_LINUX_SIGIO -# include <signal.h> -# endif #endif #if defined HAVE_SELECT @@ -63,8 +59,17 @@ # include <sys/port.h> #endif +#if defined HAVE_LIBEV +# define USE_LIBEV +# include <ev.h> +#endif + +struct server; + +typedef handler_t (*fdevent_handler)(struct server *srv, void *ctx, int revents); -typedef handler_t (*fdevent_handler)(void *srv, void *ctx, int revents); +/* these are the POLL* values from <bits/poll.h> (linux poll) + */ #define FDEVENT_IN BV(0) #define FDEVENT_PRI BV(1) @@ -83,45 +88,26 @@ typedef enum { FD_EVENT_TYPE_UNSET = -1, typedef enum { FDEVENT_HANDLER_UNSET, FDEVENT_HANDLER_SELECT, FDEVENT_HANDLER_POLL, - FDEVENT_HANDLER_LINUX_RTSIG, FDEVENT_HANDLER_LINUX_SYSEPOLL, FDEVENT_HANDLER_SOLARIS_DEVPOLL, FDEVENT_HANDLER_FREEBSD_KQUEUE, - FDEVENT_HANDLER_SOLARIS_PORT + FDEVENT_HANDLER_LIBEV } fdevent_handler_t; -/** - * a mapping from fd to connection structure - * - */ -typedef struct { - int fd; /**< the fd */ - void *conn; /**< a reference the corresponding data-structure */ - fd_event_t fd_type; /**< type of the fd */ - int events; /**< registered events */ - int revents; -} fd_conn; - -typedef struct { - fd_conn *ptr; - - size_t size; - size_t used; -} fd_conn_buffer; - -/** - * array of unused fd's - * - */ typedef struct _fdnode { fdevent_handler handler; void *ctx; + void *handler_ctx; int fd; - - struct _fdnode *prev, *next; + int events; } fdnode; +/** + * array of unused fd's + * + */ + typedef struct { int *ptr; @@ -134,18 +120,12 @@ typedef struct { * */ typedef struct fdevents { + struct server *srv; fdevent_handler_t type; fdnode **fdarray; size_t maxfds; -#ifdef USE_LINUX_SIGIO - int in_sigio; - int signum; - sigset_t sigset; - siginfo_t siginfo; - bitset *sigbset; -#endif #ifdef USE_LINUX_EPOLL int epoll_fd; struct epoll_event *epoll_events; @@ -176,15 +156,17 @@ typedef struct fdevents { #ifdef USE_FREEBSD_KQUEUE int kq_fd; struct kevent *kq_results; - bitset *kq_bevents; #endif #ifdef USE_SOLARIS_PORT int port_fd; #endif +#ifdef USE_LIBEV + struct ev_loop *libev_loop; +#endif int (*reset)(struct fdevents *ev); void (*free)(struct fdevents *ev); - int (*event_add)(struct fdevents *ev, int fde_ndx, int fd, int events); + int (*event_set)(struct fdevents *ev, int fde_ndx, int fd, int events); int (*event_del)(struct fdevents *ev, int fde_ndx, int fd); int (*event_get_revent)(struct fdevents *ev, size_t ndx); int (*event_get_fd)(struct fdevents *ev, size_t ndx); @@ -196,11 +178,11 @@ typedef struct fdevents { int (*fcntl_set)(struct fdevents *ev, int fd); } fdevents; -fdevents *fdevent_init(size_t maxfds, fdevent_handler_t type); -int fdevent_reset(fdevents *ev); +fdevents *fdevent_init(struct server *srv, size_t maxfds, fdevent_handler_t type); +int fdevent_reset(fdevents *ev); /* "init" after fork() */ void fdevent_free(fdevents *ev); -int fdevent_event_add(fdevents *ev, int *fde_ndx, int fd, int events); +int fdevent_event_set(fdevents *ev, int *fde_ndx, int fd, int events); /* events can be FDEVENT_IN, FDEVENT_OUT or FDEVENT_IN | FDEVENT_OUT */ int fdevent_event_del(fdevents *ev, int *fde_ndx, int fd); int fdevent_event_get_revent(fdevents *ev, size_t ndx); int fdevent_event_get_fd(fdevents *ev, size_t ndx); @@ -218,11 +200,9 @@ int fdevent_fcntl_set(fdevents *ev, int fd); int fdevent_select_init(fdevents *ev); int fdevent_poll_init(fdevents *ev); -int fdevent_linux_rtsig_init(fdevents *ev); int fdevent_linux_sysepoll_init(fdevents *ev); int fdevent_solaris_devpoll_init(fdevents *ev); int fdevent_freebsd_kqueue_init(fdevents *ev); +int fdevent_libev_init(fdevents *ev); #endif - - |