summaryrefslogtreecommitdiff
path: root/src/fdevent_impl.h
blob: b6ffef4c9ea26f8831fdb098554360d5ca740cb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#ifndef INCLUDED_FDEVENT_IMPL_H
#define INCLUDED_FDEVENT_IMPL_H
#include "first.h"

/* select event-system */

#if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)
# define FDEVENT_USE_LINUX_EPOLL
struct epoll_event;     /* declaration */
#endif

/* MacOS 10.3.x has poll.h under /usr/include/, all other unixes
 * under /usr/include/sys/ */
#if defined HAVE_POLL && (defined(HAVE_SYS_POLL_H) || defined(HAVE_POLL_H))
# define FDEVENT_USE_POLL
struct pollfd;          /* declaration */
#endif

#if 0 /*(disabled; needs further development for stability of results)*/
#ifdef _WIN32
# define FDEVENT_USE_POLL
struct pollfd;          /* declaration */
#endif
#endif

#ifndef FDEVENT_USE_POLL
#if defined HAVE_SELECT
# ifdef _WIN32
#  ifdef _MSC_VER
#   pragma comment(lib, "ws2_32.lib")
#  endif
#  include <winsock2.h>
# endif
# define FDEVENT_USE_SELECT
# ifdef HAVE_SYS_SELECT_H
#  include <sys/select.h>
# endif
#endif
#endif

#if defined HAVE_SYS_DEVPOLL_H && defined(__sun)
# define FDEVENT_USE_SOLARIS_DEVPOLL
struct pollfd;          /* declaration */
#endif

#if defined HAVE_PORT_H && defined HAVE_PORT_CREATE && defined(__sun)
# define FDEVENT_USE_SOLARIS_PORT
# include <port.h>
/* Illumos epoll not supported by lighttpd; POLLRDHUP != EPOLLRDHUP on Illumos*/
# undef FDEVENT_USE_LINUX_EPOLL
#endif

#if defined HAVE_SYS_EVENT_H && defined HAVE_KQUEUE
# define FDEVENT_USE_FREEBSD_KQUEUE
struct kevent;          /* declaration */
#endif

#include "base_decls.h"
#include "fdevent.h"    /* (*fdevent_handler) */

typedef enum {
    FDEVENT_HANDLER_UNSET,
    FDEVENT_HANDLER_SELECT,
    FDEVENT_HANDLER_POLL,
    FDEVENT_HANDLER_LINUX_SYSEPOLL,
    FDEVENT_HANDLER_SOLARIS_DEVPOLL,
    FDEVENT_HANDLER_SOLARIS_PORT,
    FDEVENT_HANDLER_FREEBSD_KQUEUE
} fdevent_handler_t;

/**
 * array of unused fd's
 *
 */

#ifdef FDEVENT_USE_POLL
typedef struct {
    int *ptr;

    uint32_t used;
    uint32_t size;
} buffer_int;
#endif

struct fdevents {
    fdnode **fdarray;
    fdnode *pendclose;

    int (*event_set)(struct fdevents *ev, fdnode *fdn, int events);
    int (*event_del)(struct fdevents *ev, fdnode *fdn);
    int (*poll)(struct fdevents *ev, int timeout_ms);

    log_error_st *errh;
    int *cur_fds;
    uint32_t maxfds;
  #ifdef _WIN32
    int count;
  #endif
  #ifdef FDEVENT_USE_LINUX_EPOLL
    int epoll_fd;
    struct epoll_event *epoll_events;
  #endif
  #ifdef FDEVENT_USE_SOLARIS_DEVPOLL
    int devpoll_fd;
    struct pollfd *devpollfds;
  #endif
  #ifdef FDEVENT_USE_SOLARIS_PORT
    int port_fd;
    port_event_t *port_events;
  #endif
  #ifdef FDEVENT_USE_FREEBSD_KQUEUE
    int kq_fd;
    struct kevent *kq_results;
  #endif
  #ifdef FDEVENT_USE_POLL
    struct pollfd *pollfds;

    uint32_t size;
    uint32_t used;

    buffer_int unused;
  #endif
  #ifdef FDEVENT_USE_SELECT
   #ifndef _WIN32
    int select_max_fd;
   #endif
    fd_set select_read;
    fd_set select_write;
    fd_set select_error;

    fd_set select_set_read;
    fd_set select_set_write;
    fd_set select_set_error;
  #endif

    int (*reset)(struct fdevents *ev);
    void (*free)(struct fdevents *ev);
    const char *event_handler;
    fdevent_handler_t type;
};

#endif