1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_EVENT_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_EVENT_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev#define NGX_INVALID_INDEX  0xd0d0d0d0
17e18a033bSKonstantin Ananyev
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyev#if (NGX_HAVE_IOCP)
20e18a033bSKonstantin Ananyev
21e18a033bSKonstantin Ananyevtypedef struct {
22e18a033bSKonstantin Ananyev    WSAOVERLAPPED    ovlp;
23e18a033bSKonstantin Ananyev    ngx_event_t     *event;
24e18a033bSKonstantin Ananyev    int              error;
25e18a033bSKonstantin Ananyev} ngx_event_ovlp_t;
26e18a033bSKonstantin Ananyev
27e18a033bSKonstantin Ananyev#endif
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyev
30e18a033bSKonstantin Ananyevstruct ngx_event_s {
31e18a033bSKonstantin Ananyev    void            *data;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev    unsigned         write:1;
34e18a033bSKonstantin Ananyev
35e18a033bSKonstantin Ananyev    unsigned         accept:1;
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev    /* used to detect the stale events in kqueue and epoll */
38e18a033bSKonstantin Ananyev    unsigned         instance:1;
39e18a033bSKonstantin Ananyev
40e18a033bSKonstantin Ananyev    /*
41e18a033bSKonstantin Ananyev     * the event was passed or would be passed to a kernel;
42e18a033bSKonstantin Ananyev     * in aio mode - operation was posted.
43e18a033bSKonstantin Ananyev     */
44e18a033bSKonstantin Ananyev    unsigned         active:1;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev    unsigned         disabled:1;
47e18a033bSKonstantin Ananyev
48e18a033bSKonstantin Ananyev    /* the ready event; in aio mode 0 means that no operation can be posted */
49e18a033bSKonstantin Ananyev    unsigned         ready:1;
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyev    unsigned         oneshot:1;
52e18a033bSKonstantin Ananyev
53e18a033bSKonstantin Ananyev    /* aio operation is complete */
54e18a033bSKonstantin Ananyev    unsigned         complete:1;
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyev    unsigned         eof:1;
57e18a033bSKonstantin Ananyev    unsigned         error:1;
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev    unsigned         timedout:1;
60e18a033bSKonstantin Ananyev    unsigned         timer_set:1;
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev    unsigned         delayed:1;
63e18a033bSKonstantin Ananyev
64e18a033bSKonstantin Ananyev    unsigned         deferred_accept:1;
65e18a033bSKonstantin Ananyev
66e18a033bSKonstantin Ananyev    /* the pending eof reported by kqueue, epoll or in aio chain operation */
67e18a033bSKonstantin Ananyev    unsigned         pending_eof:1;
68e18a033bSKonstantin Ananyev
69e18a033bSKonstantin Ananyev    unsigned         posted:1;
70e18a033bSKonstantin Ananyev
71e18a033bSKonstantin Ananyev    unsigned         closed:1;
72e18a033bSKonstantin Ananyev
73e18a033bSKonstantin Ananyev    /* to test on worker exit */
74e18a033bSKonstantin Ananyev    unsigned         channel:1;
75e18a033bSKonstantin Ananyev    unsigned         resolver:1;
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev    unsigned         cancelable:1;
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev#if (NGX_HAVE_KQUEUE)
80e18a033bSKonstantin Ananyev    unsigned         kq_vnode:1;
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyev    /* the pending errno reported by kqueue */
83e18a033bSKonstantin Ananyev    int              kq_errno;
84e18a033bSKonstantin Ananyev#endif
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev    /*
87e18a033bSKonstantin Ananyev     * kqueue only:
88e18a033bSKonstantin Ananyev     *   accept:     number of sockets that wait to be accepted
89e18a033bSKonstantin Ananyev     *   read:       bytes to read when event is ready
90e18a033bSKonstantin Ananyev     *               or lowat when event is set with NGX_LOWAT_EVENT flag
91e18a033bSKonstantin Ananyev     *   write:      available space in buffer when event is ready
92e18a033bSKonstantin Ananyev     *               or lowat when event is set with NGX_LOWAT_EVENT flag
93e18a033bSKonstantin Ananyev     *
94e18a033bSKonstantin Ananyev     * epoll with EPOLLRDHUP:
95e18a033bSKonstantin Ananyev     *   accept:     1 if accept many, 0 otherwise
96e18a033bSKonstantin Ananyev     *   read:       1 if there can be data to read, 0 otherwise
97e18a033bSKonstantin Ananyev     *
98e18a033bSKonstantin Ananyev     * iocp: TODO
99e18a033bSKonstantin Ananyev     *
100e18a033bSKonstantin Ananyev     * otherwise:
101e18a033bSKonstantin Ananyev     *   accept:     1 if accept many, 0 otherwise
102e18a033bSKonstantin Ananyev     */
103e18a033bSKonstantin Ananyev
104e18a033bSKonstantin Ananyev#if (NGX_HAVE_KQUEUE) || (NGX_HAVE_IOCP)
105e18a033bSKonstantin Ananyev    int              available;
106e18a033bSKonstantin Ananyev#else
107e18a033bSKonstantin Ananyev    unsigned         available:1;
108e18a033bSKonstantin Ananyev#endif
109e18a033bSKonstantin Ananyev
110e18a033bSKonstantin Ananyev    ngx_event_handler_pt  handler;
111e18a033bSKonstantin Ananyev
112e18a033bSKonstantin Ananyev
113e18a033bSKonstantin Ananyev#if (NGX_HAVE_IOCP)
114e18a033bSKonstantin Ananyev    ngx_event_ovlp_t ovlp;
115e18a033bSKonstantin Ananyev#endif
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyev    ngx_uint_t       index;
118e18a033bSKonstantin Ananyev
119e18a033bSKonstantin Ananyev    ngx_log_t       *log;
120e18a033bSKonstantin Ananyev
121e18a033bSKonstantin Ananyev    ngx_rbtree_node_t   timer;
122e18a033bSKonstantin Ananyev
123e18a033bSKonstantin Ananyev    /* the posted queue */
124e18a033bSKonstantin Ananyev    ngx_queue_t      queue;
125e18a033bSKonstantin Ananyev
126e18a033bSKonstantin Ananyev#if 0
127e18a033bSKonstantin Ananyev
128e18a033bSKonstantin Ananyev    /* the threads support */
129e18a033bSKonstantin Ananyev
130e18a033bSKonstantin Ananyev    /*
131e18a033bSKonstantin Ananyev     * the event thread context, we store it here
132e18a033bSKonstantin Ananyev     * if $(CC) does not understand __thread declaration
133e18a033bSKonstantin Ananyev     * and pthread_getspecific() is too costly
134e18a033bSKonstantin Ananyev     */
135e18a033bSKonstantin Ananyev
136e18a033bSKonstantin Ananyev    void            *thr_ctx;
137e18a033bSKonstantin Ananyev
138e18a033bSKonstantin Ananyev#if (NGX_EVENT_T_PADDING)
139e18a033bSKonstantin Ananyev
140e18a033bSKonstantin Ananyev    /* event should not cross cache line in SMP */
141e18a033bSKonstantin Ananyev
142e18a033bSKonstantin Ananyev    uint32_t         padding[NGX_EVENT_T_PADDING];
143e18a033bSKonstantin Ananyev#endif
144e18a033bSKonstantin Ananyev#endif
145e18a033bSKonstantin Ananyev};
146e18a033bSKonstantin Ananyev
147e18a033bSKonstantin Ananyev
148e18a033bSKonstantin Ananyev#if (NGX_HAVE_FILE_AIO)
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyevstruct ngx_event_aio_s {
151e18a033bSKonstantin Ananyev    void                      *data;
152e18a033bSKonstantin Ananyev    ngx_event_handler_pt       handler;
153e18a033bSKonstantin Ananyev    ngx_file_t                *file;
154e18a033bSKonstantin Ananyev
155e18a033bSKonstantin Ananyev#if (NGX_HAVE_AIO_SENDFILE || NGX_COMPAT)
156e18a033bSKonstantin Ananyev    ssize_t                  (*preload_handler)(ngx_buf_t *file);
157e18a033bSKonstantin Ananyev#endif
158e18a033bSKonstantin Ananyev
159e18a033bSKonstantin Ananyev    ngx_fd_t                   fd;
160e18a033bSKonstantin Ananyev
161e18a033bSKonstantin Ananyev#if (NGX_HAVE_EVENTFD)
162e18a033bSKonstantin Ananyev    int64_t                    res;
163e18a033bSKonstantin Ananyev#endif
164e18a033bSKonstantin Ananyev
165e18a033bSKonstantin Ananyev#if !(NGX_HAVE_EVENTFD) || (NGX_TEST_BUILD_EPOLL)
166e18a033bSKonstantin Ananyev    ngx_err_t                  err;
167e18a033bSKonstantin Ananyev    size_t                     nbytes;
168e18a033bSKonstantin Ananyev#endif
169e18a033bSKonstantin Ananyev
170e18a033bSKonstantin Ananyev    ngx_aiocb_t                aiocb;
171e18a033bSKonstantin Ananyev    ngx_event_t                event;
172e18a033bSKonstantin Ananyev};
173e18a033bSKonstantin Ananyev
174e18a033bSKonstantin Ananyev#endif
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev
177e18a033bSKonstantin Ananyevtypedef struct {
178e18a033bSKonstantin Ananyev    ngx_int_t  (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
179e18a033bSKonstantin Ananyev    ngx_int_t  (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
180e18a033bSKonstantin Ananyev
181e18a033bSKonstantin Ananyev    ngx_int_t  (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
182e18a033bSKonstantin Ananyev    ngx_int_t  (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags);
183e18a033bSKonstantin Ananyev
184e18a033bSKonstantin Ananyev    ngx_int_t  (*add_conn)(ngx_connection_t *c);
185e18a033bSKonstantin Ananyev    ngx_int_t  (*del_conn)(ngx_connection_t *c, ngx_uint_t flags);
186e18a033bSKonstantin Ananyev
187e18a033bSKonstantin Ananyev    ngx_int_t  (*notify)(ngx_event_handler_pt handler);
188e18a033bSKonstantin Ananyev
189e18a033bSKonstantin Ananyev    ngx_int_t  (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer,
190e18a033bSKonstantin Ananyev                                 ngx_uint_t flags);
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyev    ngx_int_t  (*init)(ngx_cycle_t *cycle, ngx_msec_t timer);
193e18a033bSKonstantin Ananyev    void       (*done)(ngx_cycle_t *cycle);
194e18a033bSKonstantin Ananyev} ngx_event_actions_t;
195e18a033bSKonstantin Ananyev
196e18a033bSKonstantin Ananyev
197e18a033bSKonstantin Ananyevextern ngx_event_actions_t   ngx_event_actions;
198e18a033bSKonstantin Ananyev#if (NGX_HAVE_EPOLLRDHUP)
199e18a033bSKonstantin Ananyevextern ngx_uint_t            ngx_use_epoll_rdhup;
200e18a033bSKonstantin Ananyev#endif
201e18a033bSKonstantin Ananyev
202e18a033bSKonstantin Ananyev
203e18a033bSKonstantin Ananyev/*
204e18a033bSKonstantin Ananyev * The event filter requires to read/write the whole data:
205e18a033bSKonstantin Ananyev * select, poll, /dev/poll, kqueue, epoll.
206e18a033bSKonstantin Ananyev */
207e18a033bSKonstantin Ananyev#define NGX_USE_LEVEL_EVENT      0x00000001
208e18a033bSKonstantin Ananyev
209e18a033bSKonstantin Ananyev/*
210e18a033bSKonstantin Ananyev * The event filter is deleted after a notification without an additional
211e18a033bSKonstantin Ananyev * syscall: kqueue, epoll.
212e18a033bSKonstantin Ananyev */
213e18a033bSKonstantin Ananyev#define NGX_USE_ONESHOT_EVENT    0x00000002
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyev/*
216e18a033bSKonstantin Ananyev * The event filter notifies only the changes and an initial level:
217e18a033bSKonstantin Ananyev * kqueue, epoll.
218e18a033bSKonstantin Ananyev */
219e18a033bSKonstantin Ananyev#define NGX_USE_CLEAR_EVENT      0x00000004
220e18a033bSKonstantin Ananyev
221e18a033bSKonstantin Ananyev/*
222e18a033bSKonstantin Ananyev * The event filter has kqueue features: the eof flag, errno,
223e18a033bSKonstantin Ananyev * available data, etc.
224e18a033bSKonstantin Ananyev */
225e18a033bSKonstantin Ananyev#define NGX_USE_KQUEUE_EVENT     0x00000008
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev/*
228e18a033bSKonstantin Ananyev * The event filter supports low water mark: kqueue's NOTE_LOWAT.
229e18a033bSKonstantin Ananyev * kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag.
230e18a033bSKonstantin Ananyev */
231e18a033bSKonstantin Ananyev#define NGX_USE_LOWAT_EVENT      0x00000010
232e18a033bSKonstantin Ananyev
233e18a033bSKonstantin Ananyev/*
234e18a033bSKonstantin Ananyev * The event filter requires to do i/o operation until EAGAIN: epoll.
235e18a033bSKonstantin Ananyev */
236e18a033bSKonstantin Ananyev#define NGX_USE_GREEDY_EVENT     0x00000020
237e18a033bSKonstantin Ananyev
238e18a033bSKonstantin Ananyev/*
239e18a033bSKonstantin Ananyev * The event filter is epoll.
240e18a033bSKonstantin Ananyev */
241e18a033bSKonstantin Ananyev#define NGX_USE_EPOLL_EVENT      0x00000040
242e18a033bSKonstantin Ananyev
243e18a033bSKonstantin Ananyev/*
244e18a033bSKonstantin Ananyev * Obsolete.
245e18a033bSKonstantin Ananyev */
246e18a033bSKonstantin Ananyev#define NGX_USE_RTSIG_EVENT      0x00000080
247e18a033bSKonstantin Ananyev
248e18a033bSKonstantin Ananyev/*
249e18a033bSKonstantin Ananyev * Obsolete.
250e18a033bSKonstantin Ananyev */
251e18a033bSKonstantin Ananyev#define NGX_USE_AIO_EVENT        0x00000100
252e18a033bSKonstantin Ananyev
253e18a033bSKonstantin Ananyev/*
254e18a033bSKonstantin Ananyev * Need to add socket or handle only once: i/o completion port.
255e18a033bSKonstantin Ananyev */
256e18a033bSKonstantin Ananyev#define NGX_USE_IOCP_EVENT       0x00000200
257e18a033bSKonstantin Ananyev
258e18a033bSKonstantin Ananyev/*
259e18a033bSKonstantin Ananyev * The event filter has no opaque data and requires file descriptors table:
260e18a033bSKonstantin Ananyev * poll, /dev/poll.
261e18a033bSKonstantin Ananyev */
262e18a033bSKonstantin Ananyev#define NGX_USE_FD_EVENT         0x00000400
263e18a033bSKonstantin Ananyev
264e18a033bSKonstantin Ananyev/*
265e18a033bSKonstantin Ananyev * The event module handles periodic or absolute timer event by itself:
266e18a033bSKonstantin Ananyev * kqueue in FreeBSD 4.4, NetBSD 2.0, and MacOSX 10.4, Solaris 10's event ports.
267e18a033bSKonstantin Ananyev */
268e18a033bSKonstantin Ananyev#define NGX_USE_TIMER_EVENT      0x00000800
269e18a033bSKonstantin Ananyev
270e18a033bSKonstantin Ananyev/*
271e18a033bSKonstantin Ananyev * All event filters on file descriptor are deleted after a notification:
272e18a033bSKonstantin Ananyev * Solaris 10's event ports.
273e18a033bSKonstantin Ananyev */
274e18a033bSKonstantin Ananyev#define NGX_USE_EVENTPORT_EVENT  0x00001000
275e18a033bSKonstantin Ananyev
276e18a033bSKonstantin Ananyev/*
277e18a033bSKonstantin Ananyev * The event filter support vnode notifications: kqueue.
278e18a033bSKonstantin Ananyev */
279e18a033bSKonstantin Ananyev#define NGX_USE_VNODE_EVENT      0x00002000
280e18a033bSKonstantin Ananyev
281e18a033bSKonstantin Ananyev
282e18a033bSKonstantin Ananyev/*
283e18a033bSKonstantin Ananyev * The event filter is deleted just before the closing file.
284e18a033bSKonstantin Ananyev * Has no meaning for select and poll.
285e18a033bSKonstantin Ananyev * kqueue, epoll, eventport:         allows to avoid explicit delete,
286e18a033bSKonstantin Ananyev *                                   because filter automatically is deleted
287e18a033bSKonstantin Ananyev *                                   on file close,
288e18a033bSKonstantin Ananyev *
289e18a033bSKonstantin Ananyev * /dev/poll:                        we need to flush POLLREMOVE event
290e18a033bSKonstantin Ananyev *                                   before closing file.
291e18a033bSKonstantin Ananyev */
292e18a033bSKonstantin Ananyev#define NGX_CLOSE_EVENT    1
293e18a033bSKonstantin Ananyev
294e18a033bSKonstantin Ananyev/*
295e18a033bSKonstantin Ananyev * disable temporarily event filter, this may avoid locks
296e18a033bSKonstantin Ananyev * in kernel malloc()/free(): kqueue.
297e18a033bSKonstantin Ananyev */
298e18a033bSKonstantin Ananyev#define NGX_DISABLE_EVENT  2
299e18a033bSKonstantin Ananyev
300e18a033bSKonstantin Ananyev/*
301e18a033bSKonstantin Ananyev * event must be passed to kernel right now, do not wait until batch processing.
302e18a033bSKonstantin Ananyev */
303e18a033bSKonstantin Ananyev#define NGX_FLUSH_EVENT    4
304e18a033bSKonstantin Ananyev
305e18a033bSKonstantin Ananyev
306e18a033bSKonstantin Ananyev/* these flags have a meaning only for kqueue */
307e18a033bSKonstantin Ananyev#define NGX_LOWAT_EVENT    0
308e18a033bSKonstantin Ananyev#define NGX_VNODE_EVENT    0
309e18a033bSKonstantin Ananyev
310e18a033bSKonstantin Ananyev
311e18a033bSKonstantin Ananyev#if (NGX_HAVE_EPOLL) && !(NGX_HAVE_EPOLLRDHUP)
312e18a033bSKonstantin Ananyev#define EPOLLRDHUP         0
313e18a033bSKonstantin Ananyev#endif
314e18a033bSKonstantin Ananyev
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev#if (NGX_HAVE_KQUEUE)
317e18a033bSKonstantin Ananyev
318e18a033bSKonstantin Ananyev#define NGX_READ_EVENT     EVFILT_READ
319e18a033bSKonstantin Ananyev#define NGX_WRITE_EVENT    EVFILT_WRITE
320e18a033bSKonstantin Ananyev
321e18a033bSKonstantin Ananyev#undef  NGX_VNODE_EVENT
322e18a033bSKonstantin Ananyev#define NGX_VNODE_EVENT    EVFILT_VNODE
323e18a033bSKonstantin Ananyev
324e18a033bSKonstantin Ananyev/*
325e18a033bSKonstantin Ananyev * NGX_CLOSE_EVENT, NGX_LOWAT_EVENT, and NGX_FLUSH_EVENT are the module flags
326e18a033bSKonstantin Ananyev * and they must not go into a kernel so we need to choose the value
327e18a033bSKonstantin Ananyev * that must not interfere with any existent and future kqueue flags.
328e18a033bSKonstantin Ananyev * kqueue has such values - EV_FLAG1, EV_EOF, and EV_ERROR:
329e18a033bSKonstantin Ananyev * they are reserved and cleared on a kernel entrance.
330e18a033bSKonstantin Ananyev */
331e18a033bSKonstantin Ananyev#undef  NGX_CLOSE_EVENT
332e18a033bSKonstantin Ananyev#define NGX_CLOSE_EVENT    EV_EOF
333e18a033bSKonstantin Ananyev
334e18a033bSKonstantin Ananyev#undef  NGX_LOWAT_EVENT
335e18a033bSKonstantin Ananyev#define NGX_LOWAT_EVENT    EV_FLAG1
336e18a033bSKonstantin Ananyev
337e18a033bSKonstantin Ananyev#undef  NGX_FLUSH_EVENT
338e18a033bSKonstantin Ananyev#define NGX_FLUSH_EVENT    EV_ERROR
339e18a033bSKonstantin Ananyev
340e18a033bSKonstantin Ananyev#define NGX_LEVEL_EVENT    0
341e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  EV_ONESHOT
342e18a033bSKonstantin Ananyev#define NGX_CLEAR_EVENT    EV_CLEAR
343e18a033bSKonstantin Ananyev
344e18a033bSKonstantin Ananyev#undef  NGX_DISABLE_EVENT
345e18a033bSKonstantin Ananyev#define NGX_DISABLE_EVENT  EV_DISABLE
346e18a033bSKonstantin Ananyev
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev#elif (NGX_HAVE_DEVPOLL && !(NGX_TEST_BUILD_DEVPOLL)) \
349e18a033bSKonstantin Ananyev      || (NGX_HAVE_EVENTPORT && !(NGX_TEST_BUILD_EVENTPORT))
350e18a033bSKonstantin Ananyev
351e18a033bSKonstantin Ananyev#define NGX_READ_EVENT     POLLIN
352e18a033bSKonstantin Ananyev#define NGX_WRITE_EVENT    POLLOUT
353e18a033bSKonstantin Ananyev
354e18a033bSKonstantin Ananyev#define NGX_LEVEL_EVENT    0
355e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  1
356e18a033bSKonstantin Ananyev
357e18a033bSKonstantin Ananyev
358e18a033bSKonstantin Ananyev#elif (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)
359e18a033bSKonstantin Ananyev
360e18a033bSKonstantin Ananyev#define NGX_READ_EVENT     (EPOLLIN|EPOLLRDHUP)
361e18a033bSKonstantin Ananyev#define NGX_WRITE_EVENT    EPOLLOUT
362e18a033bSKonstantin Ananyev
363e18a033bSKonstantin Ananyev#define NGX_LEVEL_EVENT    0
364e18a033bSKonstantin Ananyev#define NGX_CLEAR_EVENT    EPOLLET
365e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  0x70000000
366e18a033bSKonstantin Ananyev#if 0
367e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  EPOLLONESHOT
368e18a033bSKonstantin Ananyev#endif
369e18a033bSKonstantin Ananyev
370e18a033bSKonstantin Ananyev#if (NGX_HAVE_EPOLLEXCLUSIVE)
371e18a033bSKonstantin Ananyev#define NGX_EXCLUSIVE_EVENT  EPOLLEXCLUSIVE
372e18a033bSKonstantin Ananyev#endif
373e18a033bSKonstantin Ananyev
374e18a033bSKonstantin Ananyev#elif (NGX_HAVE_POLL)
375e18a033bSKonstantin Ananyev
376e18a033bSKonstantin Ananyev#define NGX_READ_EVENT     POLLIN
377e18a033bSKonstantin Ananyev#define NGX_WRITE_EVENT    POLLOUT
378e18a033bSKonstantin Ananyev
379e18a033bSKonstantin Ananyev#define NGX_LEVEL_EVENT    0
380e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  1
381e18a033bSKonstantin Ananyev
382e18a033bSKonstantin Ananyev
383e18a033bSKonstantin Ananyev#else /* select */
384e18a033bSKonstantin Ananyev
385e18a033bSKonstantin Ananyev#define NGX_READ_EVENT     0
386e18a033bSKonstantin Ananyev#define NGX_WRITE_EVENT    1
387e18a033bSKonstantin Ananyev
388e18a033bSKonstantin Ananyev#define NGX_LEVEL_EVENT    0
389e18a033bSKonstantin Ananyev#define NGX_ONESHOT_EVENT  1
390e18a033bSKonstantin Ananyev
391e18a033bSKonstantin Ananyev#endif /* NGX_HAVE_KQUEUE */
392e18a033bSKonstantin Ananyev
393e18a033bSKonstantin Ananyev
394e18a033bSKonstantin Ananyev#if (NGX_HAVE_IOCP)
395e18a033bSKonstantin Ananyev#define NGX_IOCP_ACCEPT      0
396e18a033bSKonstantin Ananyev#define NGX_IOCP_IO          1
397e18a033bSKonstantin Ananyev#define NGX_IOCP_CONNECT     2
398e18a033bSKonstantin Ananyev#endif
399e18a033bSKonstantin Ananyev
400e18a033bSKonstantin Ananyev
401e18a033bSKonstantin Ananyev#if (NGX_TEST_BUILD_EPOLL)
402e18a033bSKonstantin Ananyev#define NGX_EXCLUSIVE_EVENT  0
403e18a033bSKonstantin Ananyev#endif
404e18a033bSKonstantin Ananyev
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev#ifndef NGX_CLEAR_EVENT
407e18a033bSKonstantin Ananyev#define NGX_CLEAR_EVENT    0    /* dummy declaration */
408e18a033bSKonstantin Ananyev#endif
409e18a033bSKonstantin Ananyev
410e18a033bSKonstantin Ananyev
411e18a033bSKonstantin Ananyev#define ngx_process_events   ngx_event_actions.process_events
412e18a033bSKonstantin Ananyev#define ngx_done_events      ngx_event_actions.done
413e18a033bSKonstantin Ananyev
414e18a033bSKonstantin Ananyev#define ngx_add_event        ngx_event_actions.add
415e18a033bSKonstantin Ananyev#define ngx_del_event        ngx_event_actions.del
416e18a033bSKonstantin Ananyev#define ngx_add_conn         ngx_event_actions.add_conn
417e18a033bSKonstantin Ananyev#define ngx_del_conn         ngx_event_actions.del_conn
418e18a033bSKonstantin Ananyev
419e18a033bSKonstantin Ananyev#define ngx_notify           ngx_event_actions.notify
420e18a033bSKonstantin Ananyev
421e18a033bSKonstantin Ananyev#define ngx_add_timer        ngx_event_add_timer
422e18a033bSKonstantin Ananyev#define ngx_del_timer        ngx_event_del_timer
423