1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#include <ngx_config.h>
9e18a033bSKonstantin Ananyev#include <ngx_core.h>
10e18a033bSKonstantin Ananyev#include <ngx_event.h>
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev
13e18a033bSKonstantin Ananyev#define DEFAULT_CONNECTIONS  512
14e18a033bSKonstantin Ananyev
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyevextern ngx_module_t ngx_kqueue_module;
17e18a033bSKonstantin Ananyevextern ngx_module_t ngx_eventport_module;
18e18a033bSKonstantin Ananyevextern ngx_module_t ngx_devpoll_module;
19e18a033bSKonstantin Ananyevextern ngx_module_t ngx_epoll_module;
20e18a033bSKonstantin Ananyevextern ngx_module_t ngx_select_module;
21e18a033bSKonstantin Ananyev
22e18a033bSKonstantin Ananyev
23e18a033bSKonstantin Ananyevstatic char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);
24e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle);
25e18a033bSKonstantin Ananyevstatic ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle);
26e18a033bSKonstantin Ananyevstatic char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
27e18a033bSKonstantin Ananyev
28e18a033bSKonstantin Ananyevstatic char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd,
29e18a033bSKonstantin Ananyev    void *conf);
30e18a033bSKonstantin Ananyevstatic char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
31e18a033bSKonstantin Ananyevstatic char *ngx_event_debug_connection(ngx_conf_t *cf, ngx_command_t *cmd,
32e18a033bSKonstantin Ananyev    void *conf);
33e18a033bSKonstantin Ananyev
34e18a033bSKonstantin Ananyevstatic void *ngx_event_core_create_conf(ngx_cycle_t *cycle);
35e18a033bSKonstantin Ananyevstatic char *ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf);
36e18a033bSKonstantin Ananyev
37e18a033bSKonstantin Ananyev
38e18a033bSKonstantin Ananyevstatic ngx_uint_t     ngx_timer_resolution;
39e18a033bSKonstantin Ananyevsig_atomic_t          ngx_event_timer_alarm;
40e18a033bSKonstantin Ananyev
41e18a033bSKonstantin Ananyevstatic ngx_uint_t     ngx_event_max_module;
42e18a033bSKonstantin Ananyev
43e18a033bSKonstantin Ananyevngx_uint_t            ngx_event_flags;
44e18a033bSKonstantin Ananyevngx_event_actions_t   ngx_event_actions;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyevstatic ngx_atomic_t   connection_counter = 1;
48e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_connection_counter = &connection_counter;
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev
51e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_accept_mutex_ptr;
52e18a033bSKonstantin Ananyevngx_shmtx_t           ngx_accept_mutex;
53e18a033bSKonstantin Ananyevngx_uint_t            ngx_use_accept_mutex;
54e18a033bSKonstantin Ananyevngx_uint_t            ngx_accept_events;
55e18a033bSKonstantin Ananyevngx_uint_t            ngx_accept_mutex_held;
56e18a033bSKonstantin Ananyevngx_msec_t            ngx_accept_mutex_delay;
57e18a033bSKonstantin Ananyevngx_int_t             ngx_accept_disabled;
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyev
60e18a033bSKonstantin Ananyev#if (NGX_STAT_STUB)
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_accepted0;
63e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_accepted = &ngx_stat_accepted0;
64e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_handled0;
65e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_handled = &ngx_stat_handled0;
66e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_requests0;
67e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_requests = &ngx_stat_requests0;
68e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_active0;
69e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_active = &ngx_stat_active0;
70e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_reading0;
71e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_reading = &ngx_stat_reading0;
72e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_writing0;
73e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_writing = &ngx_stat_writing0;
74e18a033bSKonstantin Ananyevstatic ngx_atomic_t   ngx_stat_waiting0;
75e18a033bSKonstantin Ananyevngx_atomic_t         *ngx_stat_waiting = &ngx_stat_waiting0;
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev#endif
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_events_commands[] = {
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyev    { ngx_string("events"),
84e18a033bSKonstantin Ananyev      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
85e18a033bSKonstantin Ananyev      ngx_events_block,
86e18a033bSKonstantin Ananyev      0,
87e18a033bSKonstantin Ananyev      0,
88e18a033bSKonstantin Ananyev      NULL },
89e18a033bSKonstantin Ananyev
90e18a033bSKonstantin Ananyev      ngx_null_command
91e18a033bSKonstantin Ananyev};
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyev
94e18a033bSKonstantin Ananyevstatic ngx_core_module_t  ngx_events_module_ctx = {
95e18a033bSKonstantin Ananyev    ngx_string("events"),
96e18a033bSKonstantin Ananyev    NULL,
97e18a033bSKonstantin Ananyev    ngx_event_init_conf
98e18a033bSKonstantin Ananyev};
99e18a033bSKonstantin Ananyev
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyevngx_module_t  ngx_events_module = {
102e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
103e18a033bSKonstantin Ananyev    &ngx_events_module_ctx,                /* module context */
104e18a033bSKonstantin Ananyev    ngx_events_commands,                   /* module directives */
105e18a033bSKonstantin Ananyev    NGX_CORE_MODULE,                       /* module type */
106e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
107e18a033bSKonstantin Ananyev    NULL,                                  /* init module */
108e18a033bSKonstantin Ananyev    NULL,                                  /* init process */
109e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
110e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
111e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
112e18a033bSKonstantin Ananyev    NULL,                                  /* exit master */
113e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
114e18a033bSKonstantin Ananyev};
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev
117e18a033bSKonstantin Ananyevstatic ngx_str_t  event_core_name = ngx_string("event_core");
118e18a033bSKonstantin Ananyev
119e18a033bSKonstantin Ananyev
120e18a033bSKonstantin Ananyevstatic ngx_command_t  ngx_event_core_commands[] = {
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyev    { ngx_string("worker_connections"),
123e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_TAKE1,
124e18a033bSKonstantin Ananyev      ngx_event_connections,
125e18a033bSKonstantin Ananyev      0,
126e18a033bSKonstantin Ananyev      0,
127e18a033bSKonstantin Ananyev      NULL },
128e18a033bSKonstantin Ananyev
129e18a033bSKonstantin Ananyev    { ngx_string("use"),
130e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_TAKE1,
131e18a033bSKonstantin Ananyev      ngx_event_use,
132e18a033bSKonstantin Ananyev      0,
133e18a033bSKonstantin Ananyev      0,
134e18a033bSKonstantin Ananyev      NULL },
135e18a033bSKonstantin Ananyev
136e18a033bSKonstantin Ananyev    { ngx_string("multi_accept"),
137e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_FLAG,
138e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
139e18a033bSKonstantin Ananyev      0,
140e18a033bSKonstantin Ananyev      offsetof(ngx_event_conf_t, multi_accept),
141e18a033bSKonstantin Ananyev      NULL },
142e18a033bSKonstantin Ananyev
143e18a033bSKonstantin Ananyev    { ngx_string("accept_mutex"),
144e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_FLAG,
145e18a033bSKonstantin Ananyev      ngx_conf_set_flag_slot,
146e18a033bSKonstantin Ananyev      0,
147e18a033bSKonstantin Ananyev      offsetof(ngx_event_conf_t, accept_mutex),
148e18a033bSKonstantin Ananyev      NULL },
149e18a033bSKonstantin Ananyev
150e18a033bSKonstantin Ananyev    { ngx_string("accept_mutex_delay"),
151e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_TAKE1,
152e18a033bSKonstantin Ananyev      ngx_conf_set_msec_slot,
153e18a033bSKonstantin Ananyev      0,
154e18a033bSKonstantin Ananyev      offsetof(ngx_event_conf_t, accept_mutex_delay),
155e18a033bSKonstantin Ananyev      NULL },
156e18a033bSKonstantin Ananyev
157e18a033bSKonstantin Ananyev    { ngx_string("debug_connection"),
158e18a033bSKonstantin Ananyev      NGX_EVENT_CONF|NGX_CONF_TAKE1,
159e18a033bSKonstantin Ananyev      ngx_event_debug_connection,
160e18a033bSKonstantin Ananyev      0,
161e18a033bSKonstantin Ananyev      0,
162e18a033bSKonstantin Ananyev      NULL },
163e18a033bSKonstantin Ananyev
164e18a033bSKonstantin Ananyev      ngx_null_command
165e18a033bSKonstantin Ananyev};
166e18a033bSKonstantin Ananyev
167e18a033bSKonstantin Ananyev
168e18a033bSKonstantin Ananyevstatic ngx_event_module_t  ngx_event_core_module_ctx = {
169e18a033bSKonstantin Ananyev    &event_core_name,
170e18a033bSKonstantin Ananyev    ngx_event_core_create_conf,            /* create configuration */
171e18a033bSKonstantin Ananyev    ngx_event_core_init_conf,              /* init configuration */
172e18a033bSKonstantin Ananyev
173e18a033bSKonstantin Ananyev    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
174e18a033bSKonstantin Ananyev};
175e18a033bSKonstantin Ananyev
176e18a033bSKonstantin Ananyev
177e18a033bSKonstantin Ananyevngx_module_t  ngx_event_core_module = {
178e18a033bSKonstantin Ananyev    NGX_MODULE_V1,
179e18a033bSKonstantin Ananyev    &ngx_event_core_module_ctx,            /* module context */
180e18a033bSKonstantin Ananyev    ngx_event_core_commands,               /* module directives */
181e18a033bSKonstantin Ananyev    NGX_EVENT_MODULE,                      /* module type */
182e18a033bSKonstantin Ananyev    NULL,                                  /* init master */
183e18a033bSKonstantin Ananyev    ngx_event_module_init,                 /* init module */
184e18a033bSKonstantin Ananyev    ngx_event_process_init,                /* init process */
185e18a033bSKonstantin Ananyev    NULL,                                  /* init thread */
186e18a033bSKonstantin Ananyev    NULL,                                  /* exit thread */
187e18a033bSKonstantin Ananyev    NULL,                                  /* exit process */
188e18a033bSKonstantin Ananyev    NULL,                                  /* exit master */
189e18a033bSKonstantin Ananyev    NGX_MODULE_V1_PADDING
190e18a033bSKonstantin Ananyev};
191e18a033bSKonstantin Ananyev
192e18a033bSKonstantin Ananyev
193e18a033bSKonstantin Ananyevvoid
194e18a033bSKonstantin Ananyevngx_process_events_and_timers(ngx_cycle_t *cycle)
195e18a033bSKonstantin Ananyev{
196e18a033bSKonstantin Ananyev    ngx_uint_t  flags;
197e18a033bSKonstantin Ananyev    ngx_msec_t  timer, delta;
198e18a033bSKonstantin Ananyev
199e18a033bSKonstantin Ananyev    if (ngx_timer_resolution) {
200e18a033bSKonstantin Ananyev        timer = NGX_TIMER_INFINITE;
201e18a033bSKonstantin Ananyev        flags = 0;
202e18a033bSKonstantin Ananyev
203e18a033bSKonstantin Ananyev    } else {
204e18a033bSKonstantin Ananyev        timer = ngx_event_find_timer();
205e18a033bSKonstantin Ananyev        flags = NGX_UPDATE_TIME;
206e18a033bSKonstantin Ananyev
207e18a033bSKonstantin Ananyev#if (NGX_WIN32)
208e18a033bSKonstantin Ananyev
209e18a033bSKonstantin Ananyev        /* handle signals from master in case of network inactivity */
210e18a033bSKonstantin Ananyev
211e18a033bSKonstantin Ananyev        if (timer == NGX_TIMER_INFINITE || timer > 500) {
212e18a033bSKonstantin Ananyev            timer = 500;
213e18a033bSKonstantin Ananyev        }
214e18a033bSKonstantin Ananyev
215e18a033bSKonstantin Ananyev#endif
216e18a033bSKonstantin Ananyev    }
217e18a033bSKonstantin Ananyev
218e18a033bSKonstantin Ananyev    if (ngx_use_accept_mutex) {
219e18a033bSKonstantin Ananyev        if (ngx_accept_disabled > 0) {
220e18a033bSKonstantin Ananyev            ngx_accept_disabled--;
221e18a033bSKonstantin Ananyev
222e18a033bSKonstantin Ananyev        } else {
223e18a033bSKonstantin Ananyev            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
224e18a033bSKonstantin Ananyev                return;
225e18a033bSKonstantin Ananyev            }
226e18a033bSKonstantin Ananyev
227e18a033bSKonstantin Ananyev            if (ngx_accept_mutex_held) {
228e18a033bSKonstantin Ananyev                flags |= NGX_POST_EVENTS;
229e18a033bSKonstantin Ananyev
230e18a033bSKonstantin Ananyev            } else {
231e18a033bSKonstantin Ananyev                if (timer == NGX_TIMER_INFINITE
232e18a033bSKonstantin Ananyev                    || timer > ngx_accept_mutex_delay)
233e18a033bSKonstantin Ananyev                {
234e18a033bSKonstantin Ananyev                    timer = ngx_accept_mutex_delay;
235e18a033bSKonstantin Ananyev                }
236e18a033bSKonstantin Ananyev            }
237e18a033bSKonstantin Ananyev        }
238e18a033bSKonstantin Ananyev    }
239e18a033bSKonstantin Ananyev
240e18a033bSKonstantin Ananyev    delta = ngx_current_msec;
241e18a033bSKonstantin Ananyev
242e18a033bSKonstantin Ananyev    (void) ngx_process_events(cycle, timer, flags);
243e18a033bSKonstantin Ananyev
244e18a033bSKonstantin Ananyev    delta = ngx_current_msec - delta;
245e18a033bSKonstantin Ananyev
246e18a033bSKonstantin Ananyev    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
247e18a033bSKonstantin Ananyev                   "timer delta: %M", delta);
248e18a033bSKonstantin Ananyev
249e18a033bSKonstantin Ananyev    ngx_event_process_posted(cycle, &ngx_posted_accept_events);
250e18a033bSKonstantin Ananyev
251e18a033bSKonstantin Ananyev    if (ngx_accept_mutex_held) {
252e18a033bSKonstantin Ananyev        ngx_shmtx_unlock(&ngx_accept_mutex);
253e18a033bSKonstantin Ananyev    }
254e18a033bSKonstantin Ananyev
255e18a033bSKonstantin Ananyev    if (delta) {
256e18a033bSKonstantin Ananyev        ngx_event_expire_timers();
257e18a033bSKonstantin Ananyev    }
258e18a033bSKonstantin Ananyev
259e18a033bSKonstantin Ananyev    ngx_event_process_posted(cycle, &ngx_posted_events);
260e18a033bSKonstantin Ananyev}
261e18a033bSKonstantin Ananyev
262e18a033bSKonstantin Ananyev
263e18a033bSKonstantin Ananyevngx_int_t
264e18a033bSKonstantin Ananyevngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
265e18a033bSKonstantin Ananyev{
266e18a033bSKonstantin Ananyev    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
267e18a033bSKonstantin Ananyev
268e18a033bSKonstantin Ananyev        /* kqueue, epoll */
269e18a033bSKonstantin Ananyev
270e18a033bSKonstantin Ananyev        if (!rev->active && !rev->ready) {
271e18a033bSKonstantin Ananyev            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_CLEAR_EVENT)
272e18a033bSKonstantin Ananyev                == NGX_ERROR)
273e18a033bSKonstantin Ananyev            {
274e18a033bSKonstantin Ananyev                return NGX_ERROR;
275e18a033bSKonstantin Ananyev            }
276e18a033bSKonstantin Ananyev        }
277e18a033bSKonstantin Ananyev
278e18a033bSKonstantin Ananyev        return NGX_OK;
279e18a033bSKonstantin Ananyev
280e18a033bSKonstantin Ananyev    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {
281e18a033bSKonstantin Ananyev
282e18a033bSKonstantin Ananyev        /* select, poll, /dev/poll */
283e18a033bSKonstantin Ananyev
284e18a033bSKonstantin Ananyev        if (!rev->active && !rev->ready) {
285e18a033bSKonstantin Ananyev            if (ngx_add_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT)
286e18a033bSKonstantin Ananyev                == NGX_ERROR)
287e18a033bSKonstantin Ananyev            {
288e18a033bSKonstantin Ananyev                return NGX_ERROR;
289e18a033bSKonstantin Ananyev            }
290e18a033bSKonstantin Ananyev
291e18a033bSKonstantin Ananyev            return NGX_OK;
292e18a033bSKonstantin Ananyev        }
293e18a033bSKonstantin Ananyev
294e18a033bSKonstantin Ananyev        if (rev->active && (rev->ready || (flags & NGX_CLOSE_EVENT))) {
295e18a033bSKonstantin Ananyev            if (ngx_del_event(rev, NGX_READ_EVENT, NGX_LEVEL_EVENT | flags)
296e18a033bSKonstantin Ananyev                == NGX_ERROR)
297e18a033bSKonstantin Ananyev            {
298e18a033bSKonstantin Ananyev                return NGX_ERROR;
299e18a033bSKonstantin Ananyev            }
300e18a033bSKonstantin Ananyev
301e18a033bSKonstantin Ananyev            return NGX_OK;
302e18a033bSKonstantin Ananyev        }
303e18a033bSKonstantin Ananyev
304e18a033bSKonstantin Ananyev    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {
305e18a033bSKonstantin Ananyev
306e18a033bSKonstantin Ananyev        /* event ports */
307e18a033bSKonstantin Ananyev
308e18a033bSKonstantin Ananyev        if (!rev->active && !rev->ready) {
309e18a033bSKonstantin Ananyev            if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
310e18a033bSKonstantin Ananyev                return NGX_ERROR;
311e18a033bSKonstantin Ananyev            }
312e18a033bSKonstantin Ananyev
313e18a033bSKonstantin Ananyev            return NGX_OK;
314e18a033bSKonstantin Ananyev        }
315e18a033bSKonstantin Ananyev
316e18a033bSKonstantin Ananyev        if (rev->oneshot && !rev->ready) {
317e18a033bSKonstantin Ananyev            if (ngx_del_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {
318e18a033bSKonstantin Ananyev                return NGX_ERROR;
319e18a033bSKonstantin Ananyev            }
320e18a033bSKonstantin Ananyev
321e18a033bSKonstantin Ananyev            return NGX_OK;
322e18a033bSKonstantin Ananyev        }
323e18a033bSKonstantin Ananyev    }
324e18a033bSKonstantin Ananyev
325e18a033bSKonstantin Ananyev    /* iocp */
326e18a033bSKonstantin Ananyev
327e18a033bSKonstantin Ananyev    return NGX_OK;
328e18a033bSKonstantin Ananyev}
329e18a033bSKonstantin Ananyev
330e18a033bSKonstantin Ananyev
331e18a033bSKonstantin Ananyevngx_int_t
332e18a033bSKonstantin Ananyevngx_handle_write_event(ngx_event_t *wev, size_t lowat)
333e18a033bSKonstantin Ananyev{
334e18a033bSKonstantin Ananyev    ngx_connection_t  *c;
335e18a033bSKonstantin Ananyev
336e18a033bSKonstantin Ananyev    if (lowat) {
337e18a033bSKonstantin Ananyev        c = wev->data;
338e18a033bSKonstantin Ananyev
339e18a033bSKonstantin Ananyev        if (ngx_send_lowat(c, lowat) == NGX_ERROR) {
340e18a033bSKonstantin Ananyev            return NGX_ERROR;
341e18a033bSKonstantin Ananyev        }
342e18a033bSKonstantin Ananyev    }
343e18a033bSKonstantin Ananyev
344e18a033bSKonstantin Ananyev    if (ngx_event_flags & NGX_USE_CLEAR_EVENT) {
345e18a033bSKonstantin Ananyev
346e18a033bSKonstantin Ananyev        /* kqueue, epoll */
347e18a033bSKonstantin Ananyev
348e18a033bSKonstantin Ananyev        if (!wev->active && !wev->ready) {
349e18a033bSKonstantin Ananyev            if (ngx_add_event(wev, NGX_WRITE_EVENT,
350e18a033bSKonstantin Ananyev                              NGX_CLEAR_EVENT | (lowat ? NGX_LOWAT_EVENT : 0))
351e18a033bSKonstantin Ananyev                == NGX_ERROR)
352e18a033bSKonstantin Ananyev            {
353e18a033bSKonstantin Ananyev                return NGX_ERROR;
354e18a033bSKonstantin Ananyev            }
355e18a033bSKonstantin Ananyev        }
356e18a033bSKonstantin Ananyev
357e18a033bSKonstantin Ananyev        return NGX_OK;
358e18a033bSKonstantin Ananyev
359e18a033bSKonstantin Ananyev    } else if (ngx_event_flags & NGX_USE_LEVEL_EVENT) {
360e18a033bSKonstantin Ananyev
361e18a033bSKonstantin Ananyev        /* select, poll, /dev/poll */
362e18a033bSKonstantin Ananyev
363e18a033bSKonstantin Ananyev        if (!wev->active && !wev->ready) {
364e18a033bSKonstantin Ananyev            if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)
365e18a033bSKonstantin Ananyev                == NGX_ERROR)
366e18a033bSKonstantin Ananyev            {
367e18a033bSKonstantin Ananyev                return NGX_ERROR;
368e18a033bSKonstantin Ananyev            }
369e18a033bSKonstantin Ananyev
370e18a033bSKonstantin Ananyev            return NGX_OK;
371e18a033bSKonstantin Ananyev        }
372e18a033bSKonstantin Ananyev
373e18a033bSKonstantin Ananyev        if (wev->active && wev->ready) {
374e18a033bSKonstantin Ananyev            if (ngx_del_event(wev, NGX_WRITE_EVENT, NGX_LEVEL_EVENT)
375e18a033bSKonstantin Ananyev                == NGX_ERROR)
376e18a033bSKonstantin Ananyev            {
377e18a033bSKonstantin Ananyev                return NGX_ERROR;
378e18a033bSKonstantin Ananyev            }
379e18a033bSKonstantin Ananyev
380e18a033bSKonstantin Ananyev            return NGX_OK;
381e18a033bSKonstantin Ananyev        }
382e18a033bSKonstantin Ananyev
383e18a033bSKonstantin Ananyev    } else if (ngx_event_flags & NGX_USE_EVENTPORT_EVENT) {
384e18a033bSKonstantin Ananyev
385e18a033bSKonstantin Ananyev        /* event ports */
386e18a033bSKonstantin Ananyev
387e18a033bSKonstantin Ananyev        if (!wev->active && !wev->ready) {
388e18a033bSKonstantin Ananyev            if (ngx_add_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {
389e18a033bSKonstantin Ananyev                return NGX_ERROR;
390e18a033bSKonstantin Ananyev            }
391e18a033bSKonstantin Ananyev
392e18a033bSKonstantin Ananyev            return NGX_OK;
393e18a033bSKonstantin Ananyev        }
394e18a033bSKonstantin Ananyev
395e18a033bSKonstantin Ananyev        if (wev->oneshot && wev->ready) {
396e18a033bSKonstantin Ananyev            if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) == NGX_ERROR) {
397e18a033bSKonstantin Ananyev                return NGX_ERROR;
398e18a033bSKonstantin Ananyev            }
399e18a033bSKonstantin Ananyev
400e18a033bSKonstantin Ananyev            return NGX_OK;
401e18a033bSKonstantin Ananyev        }
402e18a033bSKonstantin Ananyev    }
403e18a033bSKonstantin Ananyev
404e18a033bSKonstantin Ananyev    /* iocp */
405e18a033bSKonstantin Ananyev
406e18a033bSKonstantin Ananyev    return NGX_OK;
407e18a033bSKonstantin Ananyev}
408e18a033bSKonstantin Ananyev
409e18a033bSKonstantin Ananyev
410e18a033bSKonstantin Ananyevstatic char *
411e18a033bSKonstantin Ananyevngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
412e18a033bSKonstantin Ananyev{
413e18a033bSKonstantin Ananyev    if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) {
414e18a033bSKonstantin Ananyev        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
415e18a033bSKonstantin Ananyev                      "no \"events\" section in configuration");
416e18a033bSKonstantin Ananyev        return NGX_CONF_ERROR;
417e18a033bSKonstantin Ananyev    }
418e18a033bSKonstantin Ananyev
419e18a033bSKonstantin Ananyev    return NGX_CONF_OK;
420e18a033bSKonstantin Ananyev}
421