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