Mercurial > hg > nginx
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 } |