Mercurial > hg > nginx
comparison src/event/modules/ngx_devpoll_module.c @ 115:be27f922b9a2
nginx-0.0.1-2003-07-10-20:26:57 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 10 Jul 2003 16:26:57 +0000 |
parents | ac69ab96328d |
children | 571bcbff82c5 |
comparison
equal
deleted
inserted
replaced
114:ac69ab96328d | 115:be27f922b9a2 |
---|---|
4 */ | 4 */ |
5 | 5 |
6 | 6 |
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 #include <ngx_connection.h> | |
10 #include <ngx_event.h> | 9 #include <ngx_event.h> |
11 | 10 |
12 | 11 |
13 #if (TEST_BUILD_DEVPOLL) | 12 #if (TEST_BUILD_DEVPOLL) |
14 | 13 |
30 int changes; | 29 int changes; |
31 int events; | 30 int events; |
32 } ngx_devpoll_conf_t; | 31 } ngx_devpoll_conf_t; |
33 | 32 |
34 | 33 |
35 static int ngx_devpoll_init(ngx_log_t *log); | 34 static int ngx_devpoll_init(ngx_cycle_t *cycle); |
36 static void ngx_devpoll_done(ngx_log_t *log); | 35 static void ngx_devpoll_done(ngx_cycle_t *cycle); |
37 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags); | 36 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags); |
38 static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags); | 37 static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags); |
39 static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); | 38 static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags); |
40 static int ngx_devpoll_process_events(ngx_log_t *log); | 39 static int ngx_devpoll_process_events(ngx_log_t *log); |
41 | 40 |
42 static void *ngx_devpoll_create_conf(ngx_pool_t *pool); | 41 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle); |
43 static char *ngx_devpoll_init_conf(ngx_pool_t *pool, void *conf); | 42 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf); |
44 | |
45 /* STUB */ | |
46 #define DEVPOLL_NCHANGES 512 | |
47 #define DEVPOLL_NEVENTS 512 | |
48 | 43 |
49 static int dp; | 44 static int dp; |
50 static struct pollfd *change_list, *event_list; | 45 static struct pollfd *change_list, *event_list; |
51 static u_int nchanges, max_changes; | 46 static u_int nchanges, max_changes; |
52 static int nevents; | 47 static int nevents; |
102 NGX_EVENT_MODULE, /* module type */ | 97 NGX_EVENT_MODULE, /* module type */ |
103 NULL /* init module */ | 98 NULL /* init module */ |
104 }; | 99 }; |
105 | 100 |
106 | 101 |
107 static int ngx_devpoll_init(ngx_log_t *log) | 102 static int ngx_devpoll_init(ngx_cycle_t *cycle) |
108 { | 103 { |
104 int n; | |
109 ngx_devpoll_conf_t *dpcf; | 105 ngx_devpoll_conf_t *dpcf; |
110 | 106 |
111 dpcf = ngx_event_get_conf(ngx_devpoll_module); | 107 dpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_devpoll_module); |
112 | 108 |
113 ngx_log_debug(log, "CH: %d" _ dpcf->changes); | 109 ngx_log_debug(cycle->log, "CH: %d" _ dpcf->changes); |
114 ngx_log_debug(log, "EV: %d" _ dpcf->events); | 110 ngx_log_debug(cycle->log, "EV: %d" _ dpcf->events); |
111 | |
112 if (dp == -1) { | |
113 dp = open("/dev/poll", O_RDWR); | |
114 | |
115 if (dp == -1) { | |
116 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, | |
117 "open(/dev/poll) failed"); | |
118 return NGX_ERROR; | |
119 } | |
120 } | |
121 | |
122 if (max_changes < dpcf->changes) { | |
123 if (nchanges) { | |
124 n = nchanges * sizeof(struct pollfd); | |
125 if (write(dp, change_list, n) != n) { | |
126 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
127 "write(/dev/poll) failed"); | |
128 return NGX_ERROR; | |
129 } | |
130 | |
131 nchanges = 0; | |
132 } | |
133 | |
134 if (change_list) { | |
135 ngx_free(change_list); | |
136 } | |
137 | |
138 ngx_test_null(change_list, | |
139 ngx_alloc(sizeof(struct pollfd) * dpcf->changes, | |
140 cycle->log), | |
141 NGX_ERROR); | |
142 | |
143 if (change_index) { | |
144 ngx_free(change_index); | |
145 } | |
146 | |
147 ngx_test_null(change_index, | |
148 ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes, | |
149 cycle->log), | |
150 NGX_ERROR); | |
151 } | |
115 | 152 |
116 max_changes = dpcf->changes; | 153 max_changes = dpcf->changes; |
154 | |
155 if (nevents < dpcf->events) { | |
156 if (event_list) { | |
157 ngx_free(event_list); | |
158 } | |
159 | |
160 ngx_test_null(event_list, | |
161 ngx_alloc(sizeof(struct pollfd) * dpcf->events, | |
162 cycle->log), | |
163 NGX_ERROR); | |
164 } | |
165 | |
117 nevents = dpcf->events; | 166 nevents = dpcf->events; |
118 nchanges = 0; | 167 |
119 | 168 if (ngx_event_timer_init(cycle) == NGX_ERROR) { |
120 dp = open("/dev/poll", O_RDWR); | |
121 | |
122 if (dp == -1) { | |
123 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "open(/dev/poll) failed"); | |
124 return NGX_ERROR; | 169 return NGX_ERROR; |
125 } | 170 } |
126 | 171 |
127 ngx_test_null(change_list, | 172 ngx_io = ngx_os_io; |
128 ngx_alloc(sizeof(struct pollfd) * dpcf->changes, log), | |
129 NGX_ERROR); | |
130 | |
131 ngx_test_null(event_list, | |
132 ngx_alloc(sizeof(struct pollfd) * dpcf->events, log), | |
133 NGX_ERROR); | |
134 | |
135 ngx_test_null(change_index, | |
136 ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes, log), | |
137 NGX_ERROR); | |
138 | |
139 if (ngx_event_timer_init(log) == NGX_ERROR) { | |
140 return NGX_ERROR; | |
141 } | |
142 | 173 |
143 ngx_event_actions = ngx_devpoll_module_ctx.actions; | 174 ngx_event_actions = ngx_devpoll_module_ctx.actions; |
175 | |
144 ngx_event_flags = NGX_HAVE_LEVEL_EVENT|NGX_USE_LEVEL_EVENT; | 176 ngx_event_flags = NGX_HAVE_LEVEL_EVENT|NGX_USE_LEVEL_EVENT; |
145 | 177 |
146 return NGX_OK; | 178 return NGX_OK; |
147 } | 179 } |
148 | 180 |
149 | 181 |
150 static void ngx_devpoll_done(ngx_log_t *log) | 182 static void ngx_devpoll_done(ngx_cycle_t *cycle) |
151 { | 183 { |
152 if (close(dp) == -1) { | 184 if (close(dp) == -1) { |
153 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close(/dev/poll) failed"); | 185 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
154 } | 186 "close(/dev/poll) failed"); |
155 | 187 } |
156 ngx_event_timer_done(log); | 188 |
189 dp = -1; | |
190 | |
191 ngx_event_timer_done(cycle); | |
157 | 192 |
158 ngx_free(change_list); | 193 ngx_free(change_list); |
159 ngx_free(event_list); | 194 ngx_free(event_list); |
160 ngx_free(change_index); | 195 ngx_free(change_index); |
161 | 196 |
197 change_list = NULL; | |
198 event_list = NULL; | |
199 change_index = NULL; | |
200 max_changes = 0; | |
201 nchanges = 0; | |
202 nevents = 0; | |
162 } | 203 } |
163 | 204 |
164 | 205 |
165 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) | 206 static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags) |
166 { | 207 { |
278 } | 319 } |
279 | 320 |
280 | 321 |
281 int ngx_devpoll_process_events(ngx_log_t *log) | 322 int ngx_devpoll_process_events(ngx_log_t *log) |
282 { | 323 { |
283 int events, n, i; | 324 int events, n, i; |
284 ngx_msec_t timer, delta; | 325 ngx_msec_t timer, delta; |
285 ngx_err_t err; | 326 ngx_err_t err; |
286 ngx_connection_t *c; | 327 ngx_cycle_t **cycle; |
287 struct dvpoll dvp; | 328 ngx_connection_t *c; |
288 struct timeval tv; | 329 struct dvpoll dvp; |
330 struct timeval tv; | |
289 | 331 |
290 timer = ngx_event_find_timer(); | 332 timer = ngx_event_find_timer(); |
291 | 333 |
292 if (timer) { | 334 if (timer) { |
293 gettimeofday(&tv, NULL); | 335 gettimeofday(&tv, NULL); |
349 ngx_log_error(NGX_LOG_ALERT, log, err, "ioctl(DP_POLL) failed"); | 391 ngx_log_error(NGX_LOG_ALERT, log, err, "ioctl(DP_POLL) failed"); |
350 return NGX_ERROR; | 392 return NGX_ERROR; |
351 } | 393 } |
352 | 394 |
353 for (i = 0; i < events; i++) { | 395 for (i = 0; i < events; i++) { |
396 c = &ngx_cycle->connections[event_list[i].fd]; | |
397 | |
398 if (c->fd == -1) { | |
399 cycle = ngx_old_cycles.elts; | |
400 for (i = 0; i < ngx_old_cycles.nelts; i++) { | |
401 if (cycle[i] == NULL) { | |
402 continue; | |
403 } | |
404 c = &cycle[i]->connections[event_list[i].fd]; | |
405 if (c->fd != -1) { | |
406 break; | |
407 } | |
408 } | |
409 } | |
410 | |
411 if (c->fd == -1) { | |
412 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); | |
413 exit(1); | |
414 } | |
354 | 415 |
355 #if (NGX_DEBUG_EVENT) | 416 #if (NGX_DEBUG_EVENT) |
356 ngx_log_debug(log, "devpoll: %d: ev:%d rev:%d" _ | 417 ngx_log_debug(log, "devpoll: %d: ev:%d rev:%d" _ |
357 event_list[i].fd _ | 418 event_list[i].fd _ |
358 event_list[i].events _ event_list[i].revents); | 419 event_list[i].events _ event_list[i].revents); |
359 #endif | 420 #endif |
360 | |
361 c = &ngx_connections[event_list[i].fd]; | |
362 | 421 |
363 if (event_list[i].revents & POLLIN) { | 422 if (event_list[i].revents & POLLIN) { |
364 if (!c->read->active) { | 423 if (!c->read->active) { |
365 continue; | 424 continue; |
366 } | 425 } |
392 | 451 |
393 return NGX_OK; | 452 return NGX_OK; |
394 } | 453 } |
395 | 454 |
396 | 455 |
397 static void *ngx_devpoll_create_conf(ngx_pool_t *pool) | 456 static void *ngx_devpoll_create_conf(ngx_cycle_t *cycle) |
398 { | 457 { |
399 ngx_devpoll_conf_t *dpcf; | 458 ngx_devpoll_conf_t *dpcf; |
400 | 459 |
401 ngx_test_null(dpcf, ngx_palloc(pool, sizeof(ngx_devpoll_conf_t)), | 460 ngx_test_null(dpcf, ngx_palloc(cycle->pool, sizeof(ngx_devpoll_conf_t)), |
402 NGX_CONF_ERROR); | 461 NGX_CONF_ERROR); |
403 | 462 |
404 dpcf->changes = NGX_CONF_UNSET; | 463 dpcf->changes = NGX_CONF_UNSET; |
405 dpcf->events = NGX_CONF_UNSET; | 464 dpcf->events = NGX_CONF_UNSET; |
406 | 465 |
407 return dpcf; | 466 return dpcf; |
408 } | 467 } |
409 | 468 |
410 | 469 |
411 static char *ngx_devpoll_init_conf(ngx_pool_t *pool, void *conf) | 470 static char *ngx_devpoll_init_conf(ngx_cycle_t *cycle, void *conf) |
412 { | 471 { |
413 ngx_devpoll_conf_t *dpcf = conf; | 472 ngx_devpoll_conf_t *dpcf = conf; |
414 | 473 |
415 ngx_conf_init_value(dpcf->changes, 512); | 474 ngx_conf_init_value(dpcf->changes, 512); |
416 ngx_conf_init_value(dpcf->events, 512); | 475 ngx_conf_init_value(dpcf->events, 512); |