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);