[core] isolate backend fdevent handler defs
[lighttpd.git] / src / fdevent_impl.h
blobce89ea6c1aed938874d5b3eacf88969dd46c4416
1 #ifndef INCLUDED_FDEVENT_IMPL_H
2 #define INCLUDED_FDEVENT_IMPL_H
3 #include "first.h"
5 /* select event-system */
7 #if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)
8 # define FDEVENT_USE_LINUX_EPOLL
9 struct epoll_event; /* declaration */
10 #endif
12 /* MacOS 10.3.x has poll.h under /usr/include/, all other unixes
13 * under /usr/include/sys/ */
14 #if defined HAVE_POLL && (defined(HAVE_SYS_POLL_H) || defined(HAVE_POLL_H))
15 # define FDEVENT_USE_POLL
16 struct pollfd; /* declaration */
17 #endif
19 #if defined HAVE_SELECT
20 # ifdef __WIN32
21 # include <winsock2.h>
22 # endif
23 # define FDEVENT_USE_SELECT
24 # ifdef HAVE_SYS_SELECT_H
25 # include <sys/select.h>
26 # endif
27 #endif
29 #if defined HAVE_SYS_DEVPOLL_H && defined(__sun)
30 # define FDEVENT_USE_SOLARIS_DEVPOLL
31 struct pollfd; /* declaration */
32 #endif
34 #if defined HAVE_PORT_H && defined HAVE_PORT_CREATE && defined(__sun)
35 # define FDEVENT_USE_SOLARIS_PORT
36 # include <port.h>
37 #endif
39 #if defined HAVE_SYS_EVENT_H && defined HAVE_KQUEUE
40 # define FDEVENT_USE_FREEBSD_KQUEUE
41 struct kevent; /* declaration */
42 #endif
44 #if defined HAVE_LIBEV
45 # define FDEVENT_USE_LIBEV
46 struct ev_loop; /* declaration */
47 #endif
49 #include "base_decls.h"
50 #include "settings.h" /* (handler_t) */
52 typedef enum {
53 FDEVENT_HANDLER_UNSET,
54 FDEVENT_HANDLER_SELECT,
55 FDEVENT_HANDLER_POLL,
56 FDEVENT_HANDLER_LINUX_SYSEPOLL,
57 FDEVENT_HANDLER_SOLARIS_DEVPOLL,
58 FDEVENT_HANDLER_SOLARIS_PORT,
59 FDEVENT_HANDLER_FREEBSD_KQUEUE,
60 FDEVENT_HANDLER_LIBEV
61 } fdevent_handler_t;
63 typedef handler_t (*fdevent_handler)(struct server *srv, void *ctx, int revents);
65 typedef struct _fdnode {
66 fdevent_handler handler;
67 void *ctx;
68 void *handler_ctx;
69 int fd;
70 int events;
71 } fdnode;
73 /**
74 * array of unused fd's
78 #ifdef FDEVENT_USE_POLL
79 typedef struct {
80 int *ptr;
82 size_t used;
83 size_t size;
84 } buffer_int;
85 #endif
87 struct fdevents {
88 struct server *srv;
89 fdevent_handler_t type;
91 fdnode **fdarray;
92 fdnode *pendclose;
93 size_t maxfds;
95 #ifdef FDEVENT_USE_LINUX_EPOLL
96 int epoll_fd;
97 struct epoll_event *epoll_events;
98 #endif
99 #ifdef FDEVENT_USE_POLL
100 struct pollfd *pollfds;
102 size_t size;
103 size_t used;
105 buffer_int unused;
106 #endif
107 #ifdef FDEVENT_USE_SELECT
108 fd_set select_read;
109 fd_set select_write;
110 fd_set select_error;
112 fd_set select_set_read;
113 fd_set select_set_write;
114 fd_set select_set_error;
116 int select_max_fd;
117 #endif
118 #ifdef FDEVENT_USE_SOLARIS_DEVPOLL
119 int devpoll_fd;
120 struct pollfd *devpollfds;
121 #endif
122 #ifdef FDEVENT_USE_SOLARIS_PORT
123 port_event_t *port_events;
124 #endif
125 #ifdef FDEVENT_USE_FREEBSD_KQUEUE
126 int kq_fd;
127 struct kevent *kq_results;
128 #endif
129 #ifdef FDEVENT_USE_SOLARIS_PORT
130 int port_fd;
131 #endif
132 #ifdef FDEVENT_USE_LIBEV
133 struct ev_loop *libev_loop;
134 #endif
135 int (*reset)(struct fdevents *ev);
136 void (*free)(struct fdevents *ev);
138 int (*event_set)(struct fdevents *ev, int fde_ndx, int fd, int events);
139 int (*event_del)(struct fdevents *ev, int fde_ndx, int fd);
140 int (*event_get_revent)(struct fdevents *ev, size_t ndx);
141 int (*event_get_fd)(struct fdevents *ev, size_t ndx);
143 int (*event_next_fdndx)(struct fdevents *ev, int ndx);
145 int (*poll)(struct fdevents *ev, int timeout_ms);
148 int fdevent_select_init(struct fdevents *ev);
149 int fdevent_poll_init(struct fdevents *ev);
150 int fdevent_linux_sysepoll_init(struct fdevents *ev);
151 int fdevent_solaris_devpoll_init(struct fdevents *ev);
152 int fdevent_solaris_port_init(struct fdevents *ev);
153 int fdevent_freebsd_kqueue_init(struct fdevents *ev);
154 int fdevent_libev_init(struct fdevents *ev);
156 #endif