comparison src/event/modules/ngx_epoll_module.c @ 247:008276b9e061

nginx-0.0.1-2004-02-01-11:10:52 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 01 Feb 2004 08:10:52 +0000
parents 6753e8cdaa2c
children b6793bc5034b
comparison
equal deleted inserted replaced
246:6753e8cdaa2c 247:008276b9e061
11 11
12 #if (TEST_BUILD_EPOLL) 12 #if (TEST_BUILD_EPOLL)
13 13
14 /* epoll declarations */ 14 /* epoll declarations */
15 15
16 #define EPOLLIN 0x001 16 #define EPOLLIN 0x001
17 #define EPOLLPRI 0x002 17 #define EPOLLPRI 0x002
18 #define EPOLLOUT 0x004 18 #define EPOLLOUT 0x004
19 #define EPOLLRDNORM 0x040 19 #define EPOLLRDNORM 0x040
20 #define EPOLLRDBAND 0x080 20 #define EPOLLRDBAND 0x080
21 #define EPOLLWRNORM 0x100 21 #define EPOLLWRNORM 0x100
22 #define EPOLLWRBAND 0x200 22 #define EPOLLWRBAND 0x200
23 #define EPOLLMSG 0x400 23 #define EPOLLMSG 0x400
24 #define EPOLLERR 0x008 24 #define EPOLLERR 0x008
25 #define EPOLLHUP 0x010 25 #define EPOLLHUP 0x010
26
27 #define EPOLLET 0x80000000
28 #define EPOLLONESHOT 0x40000000
26 29
27 #define EPOLL_CTL_ADD 1 30 #define EPOLL_CTL_ADD 1
28 #define EPOLL_CTL_DEL 2 31 #define EPOLL_CTL_DEL 2
29 #define EPOLL_CTL_MOD 3 32 #define EPOLL_CTL_MOD 3
30 33
112 ngx_epoll_del_connection, /* delete an connection */ 115 ngx_epoll_del_connection, /* delete an connection */
113 ngx_epoll_process_events, /* process the events */ 116 ngx_epoll_process_events, /* process the events */
114 ngx_epoll_init, /* init the events */ 117 ngx_epoll_init, /* init the events */
115 ngx_epoll_done, /* done the events */ 118 ngx_epoll_done, /* done the events */
116 } 119 }
117
118 }; 120 };
119 121
120 ngx_module_t ngx_epoll_module = { 122 ngx_module_t ngx_epoll_module = {
121 NGX_MODULE, 123 NGX_MODULE,
122 &ngx_epoll_module_ctx, /* module context */ 124 &ngx_epoll_module_ctx, /* module context */
184 } 186 }
185 187
186 188
187 static int ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags) 189 static int ngx_epoll_add_event(ngx_event_t *ev, int event, u_int flags)
188 { 190 {
189 struct epoll_event e; 191 struct epoll_event ee;
190 ngx_connection_t *c; 192 ngx_connection_t *c;
191 193
192 c = ev->data; 194 c = ev->data;
193 195
194 #if (NGX_READ_EVENT != EPOLLIN) || (NGX_WRITE_EVENT != EPOLLOUT) 196 #if (NGX_READ_EVENT != EPOLLIN) || (NGX_WRITE_EVENT != EPOLLOUT)
198 } else { 200 } else {
199 event = EPOLLOUT; 201 event = EPOLLOUT;
200 } 202 }
201 #endif 203 #endif
202 204
203 e.events = event; 205 ee.events = event;
204 e.data.ptr = (void *) ((uintptr_t) c | c->read->instance); 206 ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);
205 207
206 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, 208 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
207 "epoll add event: fd:%d ev:%04X", c->fd, e.events); 209 "epoll add event: fd:%d ev:%04X", c->fd, ee.events);
208 210
209 if (epoll_ctl(ep, EPOLL_CTL_MOD, c->fd, &e) == -1) { 211 if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) {
210 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, 212 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
211 "epoll_ctl(EPOLL_CTL_MOD, %d) failed", c->fd); 213 "epoll_ctl(EPOLL_CTL_MOD, %d) failed", c->fd);
212 return NGX_ERROR; 214 return NGX_ERROR;
213 } 215 }
214 216
217 ev->active = 1;
218
215 return NGX_OK; 219 return NGX_OK;
216 } 220 }
217 221
218 222
219 static int ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags) 223 static int ngx_epoll_del_event(ngx_event_t *ev, int event, u_int flags)
220 { 224 {
221 struct epoll_event e; 225 struct epoll_event ee;
222 ngx_connection_t *c; 226 ngx_connection_t *c;
223 227
224 c = ev->data; 228 c = ev->data;
225 229
226 #if (NGX_READ_EVENT != EPOLLIN) || (NGX_WRITE_EVENT != EPOLLOUT) 230 ee.events = 0;
227 if (event == NGX_READ_EVENT) { 231 ee.data.ptr = NULL;
228 event = EPOLLIN;
229
230 } else {
231 event = EPOLLOUT;
232 }
233 #endif
234
235 e.events = event;
236 e.data.ptr = (void *) ((uintptr_t) c | c->read->instance);
237 232
238 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, 233 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
239 "epoll del event: fd:%d ev:%04X", c->fd, e.events); 234 "epoll del event: fd:%d ev:%04X", c->fd, ee.events);
240 235
241 if (epoll_ctl(ep, EPOLL_CTL_MOD, c->fd, &e) == -1) { 236 if (epoll_ctl(ep, EPOLL_CTL_DEL, c->fd, &ee) == -1) {
242 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, 237 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
243 "epoll_ctl(EPOLL_CTL_MOD, %d) failed", c->fd); 238 "epoll_ctl(EPOLL_CTL_MOD, %d) failed", c->fd);
244 return NGX_ERROR; 239 return NGX_ERROR;
245 } 240 }
246 241
242 ev->active = 0;
243
247 return NGX_OK; 244 return NGX_OK;
248 } 245 }
249 246
250 247
251 static int ngx_epoll_add_connection(ngx_connection_t *c) 248 static int ngx_epoll_add_connection(ngx_connection_t *c)
252 { 249 {
253 struct epoll_event ev; 250 struct epoll_event ee;
254 251
255 ev.events = EPOLLIN|EPOLLOUT; 252 ee.events = EPOLLIN|EPOLLOUT;
256 ev.data.ptr = (void *) ((uintptr_t) c | c->read->instance); 253 ee.data.ptr = (void *) ((uintptr_t) c | c->read->instance);
257 254
258 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, 255 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
259 "epoll add connection: fd:%d ev:%04X", c->fd, ev.events); 256 "epoll add connection: fd:%d ev:%04X", c->fd, ee.events);
260 257
261 if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ev) == -1) { 258 if (epoll_ctl(ep, EPOLL_CTL_ADD, c->fd, &ee) == -1) {
262 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, 259 ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
263 "epoll_ctl(EPOLL_CTL_ADD, %d) failed", c->fd); 260 "epoll_ctl(EPOLL_CTL_ADD, %d) failed", c->fd);
264 return NGX_ERROR; 261 return NGX_ERROR;
265 } 262 }
266 263
314 ngx_time_update(tv.tv_sec); 311 ngx_time_update(tv.tv_sec);
315 312
316 delta = ngx_elapsed_msec; 313 delta = ngx_elapsed_msec;
317 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 314 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
318 315
319 if ((int) timer != INFTIM) { 316 if (timer != (ngx_msec_t) -1) {
320 delta = ngx_elapsed_msec - delta; 317 delta = ngx_elapsed_msec - delta;
321 318
322 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0, 319 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
323 "epoll timer: %d, delta: %d", timer, (int) delta); 320 "epoll timer: %d, delta: %d", timer, (int) delta);
324 } else { 321 } else {
346 c->fd, event_list[i].events, event_list[i].data); 343 c->fd, event_list[i].events, event_list[i].data);
347 344
348 if (c->read->instance != instance) { 345 if (c->read->instance != instance) {
349 346
350 /* 347 /*
351 * it's a stale event from a file descriptor 348 * the stale event from a file descriptor
352 * that was just closed in this iteration 349 * that was just closed in this iteration
353 */ 350 */
354 351
355 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, 352 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
356 "epoll: stale event " PTR_FMT, c); 353 "epoll: stale event " PTR_FMT, c);
357 continue; 354 continue;
358 }
359
360 if (event_list[i].events & EPOLLIN) {
361 if (!c->read->active) {
362 continue;
363 }
364
365 c->read->ready = 1;
366 c->read->event_handler(c->read);
367 }
368
369 if (event_list[i].events & EPOLLOUT) {
370 if (!c->write->active) {
371 continue;
372 }
373
374 c->write->ready = 1;
375 c->write->event_handler(c->write);
376 } 355 }
377 356
378 if (event_list[i].events & (EPOLLERR|EPOLLHUP)) { 357 if (event_list[i].events & (EPOLLERR|EPOLLHUP)) {
379 ngx_log_error(NGX_LOG_ALERT, log, 0, 358 ngx_log_error(NGX_LOG_ALERT, log, 0,
380 "epoll_wait() error on fd:%d ev:%d", 359 "epoll_wait() error on fd:%d ev:%d",
381 c->fd, event_list[i].events); 360 c->fd, event_list[i].events);
382 continue; 361 }
383 } 362
384 363 if (event_list[i].events & ~(EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP)) {
385 if (event_list[i].events & ~(EPOLLIN|EPOLLOUT)) {
386 ngx_log_error(NGX_LOG_ALERT, log, 0, 364 ngx_log_error(NGX_LOG_ALERT, log, 0,
387 "epoll_wait() returned strange events on fd:%d ev:%d", 365 "strange epoll_wait() events fd:%d ev:%04X",
388 c->fd, event_list[i].events); 366 c->fd, event_list[i].events);
389 } 367 }
390 368
369 if ((event_list[i].events & (EPOLLIN|EPOLLERR|EPOLLHUP))
370 && c->read->active)
371 {
372 c->read->ready = 1;
373 c->read->event_handler(c->read);
374 }
375
376 if ((event_list[i].events & (EPOLLOUT|EPOLLERR|EPOLLHUP))
377 && c->write->active)
378 {
379 c->write->ready = 1;
380 c->write->event_handler(c->write);
381 }
391 } 382 }
392 383
393 if (timer != (ngx_msec_t) -1 && delta) { 384 if (timer != (ngx_msec_t) -1 && delta) {
394 ngx_event_expire_timers((ngx_msec_t) delta); 385 ngx_event_expire_timers((ngx_msec_t) delta);
395 } 386 }