comparison src/event/modules/ngx_devpoll_module.c @ 245:e6c005b66b3a

nginx-0.0.1-2004-01-30-00:45:01 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 29 Jan 2004 21:45:01 +0000
parents bf2faf694c19
children 6753e8cdaa2c
comparison
equal deleted inserted replaced
244:187dc0a3197d 245:e6c005b66b3a
104 size_t n; 104 size_t n;
105 ngx_devpoll_conf_t *dpcf; 105 ngx_devpoll_conf_t *dpcf;
106 106
107 dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module); 107 dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module);
108 108
109 ngx_log_debug(cycle->log, "CH: %d" _ dpcf->changes);
110 ngx_log_debug(cycle->log, "EV: %d" _ dpcf->events);
111
112 if (dp == -1) { 109 if (dp == -1) {
113 dp = open("/dev/poll", O_RDWR); 110 dp = open("/dev/poll", O_RDWR);
114 111
115 if (dp == -1) { 112 if (dp == -1) {
116 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, 113 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
120 } 117 }
121 118
122 if (max_changes < dpcf->changes) { 119 if (max_changes < dpcf->changes) {
123 if (nchanges) { 120 if (nchanges) {
124 n = nchanges * sizeof(struct pollfd); 121 n = nchanges * sizeof(struct pollfd);
125 if ((size_t) write(dp, change_list, n) != n) { 122 if (write(dp, change_list, n) != (ssize_t) n) {
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, 123 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
127 "write(/dev/poll) failed"); 124 "write(/dev/poll) failed");
128 return NGX_ERROR; 125 return NGX_ERROR;
129 } 126 }
130 127
197 } 194 }
198 195
199 196
200 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) 197 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags)
201 { 198 {
202 #if (NGX_DEBUG_EVENT) 199 #if (NGX_DEBUG)
203 ngx_connection_t *c = (ngx_connection_t *) ev->data; 200 ngx_connection_t *c;
204 #endif 201 #endif
205 202
206 #if (NGX_READ_EVENT != POLLIN) 203 #if (NGX_READ_EVENT != POLLIN)
207 if (event == NGX_READ_EVENT) { 204 if (event == NGX_READ_EVENT) {
208 event = POLLOUT; 205 event = POLLOUT;
211 event = POLLIN; 208 event = POLLIN;
212 #endif 209 #endif
213 } 210 }
214 #endif 211 #endif
215 212
216 #if (NGX_DEBUG_EVENT) 213 #if (NGX_DEBUG)
217 c = (ngx_connection_t *) ev->data; 214 c = ev->data;
218 ngx_log_debug(ev->log, "add event: %d:%d" _ c->fd _ event); 215 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
216 "devpoll add event: fd:%d ev:%04X", c->fd, event);
219 #endif 217 #endif
220 218
221 ev->active = 1; 219 ev->active = 1;
222 return ngx_devpoll_set_event(ev, event, 0); 220 return ngx_devpoll_set_event(ev, event, 0);
223 } 221 }
228 ngx_event_t *e; 226 ngx_event_t *e;
229 ngx_connection_t *c; 227 ngx_connection_t *c;
230 228
231 c = ev->data; 229 c = ev->data;
232 230
233 #if (NGX_DEBUG_EVENT) 231 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
234 ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event); 232 "devpoll del event: fd:%d ev:%04X", c->fd, event);
235 #endif
236 233
237 if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) { 234 if (ngx_devpoll_set_event(ev, POLLREMOVE, flags) == NGX_ERROR) {
238 return NGX_ERROR; 235 return NGX_ERROR;
239 } 236 }
240 237
268 size_t n; 265 size_t n;
269 ngx_connection_t *c; 266 ngx_connection_t *c;
270 267
271 c = ev->data; 268 c = ev->data;
272 269
273 #if (NGX_DEBUG_EVENT) 270 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
274 ngx_log_debug(ev->log, "devpoll fd:%d event:%d flush:%d" _ 271 "devpoll fd:%d ev:%d fl:%d", c->fd, event, flags);
275 c->fd _ event _ flags);
276 #endif
277 272
278 if (nchanges >= max_changes) { 273 if (nchanges >= max_changes) {
279 ngx_log_error(NGX_LOG_WARN, ev->log, 0, 274 ngx_log_error(NGX_LOG_WARN, ev->log, 0,
280 "/dev/pool change list is filled up"); 275 "/dev/pool change list is filled up");
281 276
282 n = nchanges * sizeof(struct pollfd); 277 n = nchanges * sizeof(struct pollfd);
283 if ((size_t) write(dp, change_list, n) != n) { 278 if (write(dp, change_list, n) != (ssize_t) n) {
284 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, 279 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
285 "write(/dev/poll) failed"); 280 "write(/dev/poll) failed");
286 return NGX_ERROR; 281 return NGX_ERROR;
287 } 282 }
288 283
298 293
299 nchanges++; 294 nchanges++;
300 295
301 if (flags & NGX_CLOSE_EVENT) { 296 if (flags & NGX_CLOSE_EVENT) {
302 n = nchanges * sizeof(struct pollfd); 297 n = nchanges * sizeof(struct pollfd);
303 if ((size_t) write(dp, change_list, n) != n) { 298 if (write(dp, change_list, n) != (ssize_t) n) {
304 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, 299 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
305 "write(/dev/poll) failed"); 300 "write(/dev/poll) failed");
306 return NGX_ERROR; 301 return NGX_ERROR;
307 } 302 }
308 303
318 int events, i, j; 313 int events, i, j;
319 size_t n; 314 size_t n;
320 ngx_msec_t timer; 315 ngx_msec_t timer;
321 ngx_err_t err; 316 ngx_err_t err;
322 ngx_cycle_t **cycle; 317 ngx_cycle_t **cycle;
323 ngx_epoch_msec_t delta;
324 ngx_connection_t *c; 318 ngx_connection_t *c;
319 ngx_epoch_msec_t delta;
325 struct dvpoll dvp; 320 struct dvpoll dvp;
326 struct timeval tv; 321 struct timeval tv;
327 322
328 timer = ngx_event_find_timer(); 323 timer = ngx_event_find_timer();
329 324 ngx_old_elapsed_msec = ngx_elapsed_msec;
330 if (timer) { 325
331 ngx_gettimeofday(&tv); 326 if (timer == 0) {
332 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
333
334 } else {
335 timer = (ngx_msec_t) INFTIM; 327 timer = (ngx_msec_t) INFTIM;
336 delta = 0; 328 }
337 } 329
338 330 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "devpoll timer: %d", timer);
339 #if (NGX_DEBUG_EVENT)
340 ngx_log_debug(log, "devpoll timer: %d" _ timer);
341 #endif
342 331
343 if (nchanges) { 332 if (nchanges) {
344 n = nchanges * sizeof(struct pollfd); 333 n = nchanges * sizeof(struct pollfd);
345 if ((size_t) write(dp, change_list, n) != n) { 334 if (write(dp, change_list, n) != (ssize_t) n) {
346 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, 335 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
347 "write(/dev/poll) failed"); 336 "write(/dev/poll) failed");
348 return NGX_ERROR; 337 return NGX_ERROR;
349 } 338 }
350 } 339 }
361 } 350 }
362 351
363 nchanges = 0; 352 nchanges = 0;
364 353
365 ngx_gettimeofday(&tv); 354 ngx_gettimeofday(&tv);
366 355 ngx_time_update(tv.tv_sec);
367 if (ngx_cached_time != tv.tv_sec) { 356
368 ngx_cached_time = tv.tv_sec; 357 delta = ngx_elapsed_msec;
369 ngx_time_update(); 358 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
370 }
371 359
372 if ((int) timer != INFTIM) { 360 if ((int) timer != INFTIM) {
373 delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; 361 delta = ngx_elapsed_msec - delta;
374 362
375 #if (NGX_DEBUG_EVENT) 363 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
376 ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta); 364 "devpoll timer: %d, delta: %d", timer, (int) delta);
377 #endif
378 ngx_event_expire_timers((ngx_msec_t) delta);
379
380 } else { 365 } else {
381 if (events == 0) { 366 if (events == 0) {
382 ngx_log_error(NGX_LOG_ALERT, log, 0, 367 ngx_log_error(NGX_LOG_ALERT, log, 0,
383 "ioctl(DP_POLL) returned no events without timeout"); 368 "ioctl(DP_POLL) returned no events without timeout");
384 return NGX_ERROR; 369 return NGX_ERROR;
385 } 370 }
386
387 #if (NGX_DEBUG_EVENT)
388 ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta);
389 #endif
390 } 371 }
391 372
392 if (err) { 373 if (err) {
393 ngx_log_error(NGX_LOG_ALERT, log, err, "ioctl(DP_POLL) failed"); 374 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
375 log, err, "ioctl(DP_POLL) failed");
394 return NGX_ERROR; 376 return NGX_ERROR;
395 } 377 }
396 378
397 for (i = 0; i < events; i++) { 379 for (i = 0; i < events; i++) {
398 c = &ngx_cycle->connections[event_list[i].fd]; 380 c = &ngx_cycle->connections[event_list[i].fd];
409 } 391 }
410 } 392 }
411 } 393 }
412 394
413 if (c->fd == -1) { 395 if (c->fd == -1) {
414 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); 396 ngx_log_error(NGX_LOG_EMERG, log, 0, "unknown cycle");
415 exit(1); 397 exit(1);
416 } 398 }
417 399
418 #if (NGX_DEBUG_EVENT) 400 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, log, 0,
419 ngx_log_debug(log, "devpoll: %d: ev:%d rev:%d" _ 401 "devpoll: fd:%d, ev:%04X, rev:%04X",
420 event_list[i].fd _ 402 event_list[i].fd,
421 event_list[i].events _ event_list[i].revents); 403 event_list[i].events, event_list[i].revents);
422 #endif
423 404
424 if (event_list[i].revents & POLLIN) { 405 if (event_list[i].revents & POLLIN) {
425 if (!c->read->active) { 406 if (!c->read->active) {
426 continue; 407 continue;
427 } 408 }
449 "ioctl(DP_POLL) error on %d:%d", 430 "ioctl(DP_POLL) error on %d:%d",
450 event_list[i].fd, event_list[i].revents); 431 event_list[i].fd, event_list[i].revents);
451 } 432 }
452 } 433 }
453 434
435 if (timer != (ngx_msec_t) INFTIM && delta) {
436 ngx_event_expire_timers((ngx_msec_t) delta);
437 }
438
454 return NGX_OK; 439 return NGX_OK;
455 } 440 }
456 441
457 442
458 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle) 443 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle)