xref: /lighttpd1.4/src/fdevent_impl.h (revision 33fd0db9)
1 #ifndef INCLUDED_FDEVENT_IMPL_H
2 #define INCLUDED_FDEVENT_IMPL_H
3 #include "first.h"
4 
5 /* select event-system */
6 
7 #if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)
8 # define FDEVENT_USE_LINUX_EPOLL
9 struct epoll_event;     /* declaration */
10 #endif
11 
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
18 
19 #ifndef FDEVENT_USE_POLL
20 #if defined HAVE_SELECT
21 # ifdef __WIN32
22 #  include <winsock2.h>
23 # endif
24 # define FDEVENT_USE_SELECT
25 # ifdef HAVE_SYS_SELECT_H
26 #  include <sys/select.h>
27 # endif
28 #endif
29 #endif
30 
31 #if defined HAVE_SYS_DEVPOLL_H && defined(__sun)
32 # define FDEVENT_USE_SOLARIS_DEVPOLL
33 struct pollfd;          /* declaration */
34 #endif
35 
36 #if defined HAVE_PORT_H && defined HAVE_PORT_CREATE && defined(__sun)
37 # define FDEVENT_USE_SOLARIS_PORT
38 # include <port.h>
39 /* Illumos epoll not supported by lighttpd; POLLRDHUP != EPOLLRDHUP on Illumos*/
40 # undef FDEVENT_USE_LINUX_EPOLL
41 #endif
42 
43 #if defined HAVE_SYS_EVENT_H && defined HAVE_KQUEUE
44 # define FDEVENT_USE_FREEBSD_KQUEUE
45 struct kevent;          /* declaration */
46 #endif
47 
48 #include "base_decls.h"
49 #include "fdevent.h"    /* (*fdevent_handler) */
50 
51 typedef enum {
52     FDEVENT_HANDLER_UNSET,
53     FDEVENT_HANDLER_SELECT,
54     FDEVENT_HANDLER_POLL,
55     FDEVENT_HANDLER_LINUX_SYSEPOLL,
56     FDEVENT_HANDLER_SOLARIS_DEVPOLL,
57     FDEVENT_HANDLER_SOLARIS_PORT,
58     FDEVENT_HANDLER_FREEBSD_KQUEUE
59 } fdevent_handler_t;
60 
61 /**
62  * array of unused fd's
63  *
64  */
65 
66 #ifdef FDEVENT_USE_POLL
67 typedef struct {
68     int *ptr;
69 
70     uint32_t used;
71     uint32_t size;
72 } buffer_int;
73 #endif
74 
75 struct fdevents {
76     fdnode **fdarray;
77     fdnode *pendclose;
78 
79     int (*event_set)(struct fdevents *ev, fdnode *fdn, int events);
80     int (*event_del)(struct fdevents *ev, fdnode *fdn);
81     int (*poll)(struct fdevents *ev, int timeout_ms);
82 
83     log_error_st *errh;
84     int *cur_fds;
85     uint32_t maxfds;
86   #ifdef FDEVENT_USE_LINUX_EPOLL
87     int epoll_fd;
88     struct epoll_event *epoll_events;
89   #endif
90   #ifdef FDEVENT_USE_SOLARIS_DEVPOLL
91     int devpoll_fd;
92     struct pollfd *devpollfds;
93   #endif
94   #ifdef FDEVENT_USE_SOLARIS_PORT
95     int port_fd;
96     port_event_t *port_events;
97   #endif
98   #ifdef FDEVENT_USE_FREEBSD_KQUEUE
99     int kq_fd;
100     struct kevent *kq_results;
101   #endif
102   #ifdef FDEVENT_USE_POLL
103     struct pollfd *pollfds;
104 
105     uint32_t size;
106     uint32_t used;
107 
108     buffer_int unused;
109   #endif
110   #ifdef FDEVENT_USE_SELECT
111     fd_set select_read;
112     fd_set select_write;
113     fd_set select_error;
114 
115     fd_set select_set_read;
116     fd_set select_set_write;
117     fd_set select_set_error;
118 
119     int select_max_fd;
120   #endif
121 
122     int (*reset)(struct fdevents *ev);
123     void (*free)(struct fdevents *ev);
124     const char *event_handler;
125     fdevent_handler_t type;
126 };
127 
128 #endif
129