summaryrefslogtreecommitdiff
path: root/src/fdevent.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/fdevent.h')
-rw-r--r--src/fdevent.h74
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
-
-