Mercurial > hg > nginx
comparison src/event/modules/ngx_poll_module.c @ 114:ac69ab96328d
nginx-0.0.1-2003-07-07-10:11:50 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 07 Jul 2003 06:11:50 +0000 |
parents | b5be4b0448d3 |
children | be27f922b9a2 |
comparison
equal
deleted
inserted
replaced
113:d7f606e25b99 | 114:ac69ab96328d |
---|---|
7 #include <ngx_config.h> | 7 #include <ngx_config.h> |
8 #include <ngx_core.h> | 8 #include <ngx_core.h> |
9 #include <ngx_event.h> | 9 #include <ngx_event.h> |
10 | 10 |
11 | 11 |
12 static int ngx_poll_init(ngx_log_t *log); | 12 static int ngx_poll_init(ngx_cycle_t *cycle); |
13 static void ngx_poll_done(ngx_log_t *log); | 13 static void ngx_poll_done(ngx_cycle_t *cycle); |
14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); | 14 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags); |
15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); | 15 static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags); |
16 static int ngx_poll_process_events(ngx_log_t *log); | 16 static int ngx_poll_process_events(ngx_log_t *log); |
17 | 17 |
18 | 18 |
47 ngx_module_t ngx_poll_module = { | 47 ngx_module_t ngx_poll_module = { |
48 NGX_MODULE, | 48 NGX_MODULE, |
49 &ngx_poll_module_ctx, /* module context */ | 49 &ngx_poll_module_ctx, /* module context */ |
50 NULL, /* module directives */ | 50 NULL, /* module directives */ |
51 NGX_EVENT_MODULE, /* module type */ | 51 NGX_EVENT_MODULE, /* module type */ |
52 NULL /* init module */ | 52 NULL, /* init module */ |
53 NULL /* init child */ | |
53 }; | 54 }; |
54 | 55 |
55 | 56 |
56 | 57 |
57 static int ngx_poll_init(ngx_log_t *log) | 58 static int ngx_poll_init(ngx_cycle_t *cycle) |
58 { | 59 { |
59 ngx_event_conf_t *ecf; | 60 struct pollfd *list; |
60 | 61 ngx_event_t **index; |
61 ecf = ngx_event_get_conf(ngx_event_core_module); | 62 |
62 | 63 if (event_list == NULL) { |
63 ngx_test_null(event_list, | 64 nevents = 0; |
64 ngx_alloc(sizeof(struct pollfd) * ecf->connections, log), | 65 } |
65 NGX_ERROR); | 66 |
66 | 67 if (cycle->old_cycle == NULL |
67 ngx_test_null(event_index, | 68 || cycle->old_cycle->connection_n < cycle->connection_n) |
68 ngx_alloc(sizeof(ngx_event_t *) * ecf->connections, log), | 69 { |
69 NGX_ERROR); | 70 ngx_test_null(list, |
70 | 71 ngx_alloc(sizeof(struct pollfd) * cycle->connection_n, |
71 ngx_test_null(ready_index, | 72 cycle->log), |
72 ngx_alloc(sizeof(ngx_event_t *) * 2 * ecf->connections, log), | 73 NGX_ERROR); |
73 NGX_ERROR); | 74 |
74 | 75 if (event_list) { |
75 nevents = 0; | 76 ngx_memcpy(list, event_list, sizeof(ngx_event_t *) * nevents); |
76 | 77 ngx_free(event_list); |
77 if (ngx_event_timer_init(log) == NGX_ERROR) { | 78 } |
79 | |
80 event_list = list; | |
81 | |
82 ngx_test_null(index, | |
83 ngx_alloc(sizeof(ngx_event_t *) * cycle->connection_n, | |
84 cycle->log), | |
85 NGX_ERROR); | |
86 | |
87 if (event_index) { | |
88 ngx_memcpy(index, event_index, sizeof(ngx_event_t *) * nevents); | |
89 ngx_free(event_index); | |
90 } | |
91 | |
92 event_index = index; | |
93 | |
94 if (ready_index) { | |
95 ngx_free(ready_index); | |
96 } | |
97 | |
98 ngx_test_null(ready_index, | |
99 ngx_alloc(sizeof(ngx_event_t *) * 2 * cycle->connection_n, | |
100 cycle->log), | |
101 NGX_ERROR); | |
102 } | |
103 | |
104 if (ngx_event_timer_init(cycle) == NGX_ERROR) { | |
78 return NGX_ERROR; | 105 return NGX_ERROR; |
79 } | 106 } |
107 | |
108 ngx_io = ngx_os_io; | |
80 | 109 |
81 ngx_event_actions = ngx_poll_module_ctx.actions; | 110 ngx_event_actions = ngx_poll_module_ctx.actions; |
82 | 111 |
83 ngx_event_flags = NGX_HAVE_LEVEL_EVENT | 112 ngx_event_flags = NGX_HAVE_LEVEL_EVENT |
84 |NGX_HAVE_ONESHOT_EVENT | 113 |NGX_HAVE_ONESHOT_EVENT |
86 | 115 |
87 return NGX_OK; | 116 return NGX_OK; |
88 } | 117 } |
89 | 118 |
90 | 119 |
91 static void ngx_poll_done(ngx_log_t *log) | 120 static void ngx_poll_done(ngx_cycle_t *cycle) |
92 { | 121 { |
93 ngx_event_timer_done(log); | 122 ngx_event_timer_done(cycle); |
94 | 123 |
95 ngx_free(event_list); | 124 ngx_free(event_list); |
96 ngx_free(event_index); | 125 ngx_free(event_index); |
97 ngx_free(ready_index); | 126 ngx_free(ready_index); |
127 | |
128 event_list = NULL; | |
98 } | 129 } |
99 | 130 |
100 | 131 |
101 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) | 132 static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) |
102 { | 133 { |
189 } | 220 } |
190 | 221 |
191 | 222 |
192 static int ngx_poll_process_events(ngx_log_t *log) | 223 static int ngx_poll_process_events(ngx_log_t *log) |
193 { | 224 { |
194 int ready, found; | 225 int ready, found; |
195 u_int i, nready; | 226 u_int i, nready; |
196 ngx_msec_t timer, delta; | 227 ngx_msec_t timer, delta; |
197 ngx_err_t err; | 228 ngx_err_t err; |
198 ngx_event_t *ev; | 229 ngx_cycle_t **cycle; |
199 ngx_connection_t *c; | 230 ngx_event_t *ev; |
231 ngx_connection_t *c; | |
200 | 232 |
201 timer = ngx_event_find_timer(); | 233 timer = ngx_event_find_timer(); |
202 | 234 |
203 if (timer) { | 235 if (timer) { |
204 delta = ngx_msec(); | 236 delta = ngx_msec(); |
215 } | 247 } |
216 | 248 |
217 ngx_log_debug(log, "poll timer: %d" _ timer); | 249 ngx_log_debug(log, "poll timer: %d" _ timer); |
218 #endif | 250 #endif |
219 | 251 |
220 if ((ready = poll(event_list, nevents, timer)) == -1) { | 252 ready = poll(event_list, nevents, timer); |
221 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "poll() failed"); | 253 |
222 return NGX_ERROR; | 254 if (ready == -1) { |
255 err = ngx_errno; | |
256 } else { | |
257 err = 0; | |
223 } | 258 } |
224 | 259 |
225 ngx_log_debug(log, "poll ready %d" _ ready); | 260 ngx_log_debug(log, "poll ready %d" _ ready); |
226 | 261 |
227 if ((int) timer != INFTIM) { | 262 if ((int) timer != INFTIM) { |
228 delta = ngx_msec() - delta; | 263 delta = ngx_msec() - delta; |
264 | |
265 #if (NGX_DEBUG_EVENT) | |
266 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta); | |
267 #endif | |
229 ngx_event_expire_timers(delta); | 268 ngx_event_expire_timers(delta); |
230 | 269 |
231 } else { | 270 } else { |
232 if (ready == 0) { | 271 if (ready == 0) { |
233 ngx_log_error(NGX_LOG_ALERT, log, 0, | 272 ngx_log_error(NGX_LOG_ALERT, log, 0, |
234 "poll() returns no events without timeout"); | 273 "poll() returns no events without timeout"); |
235 return NGX_ERROR; | 274 return NGX_ERROR; |
236 } | 275 } |
237 } | 276 |
238 | 277 #if (NGX_DEBUG_EVENT) |
239 #if (NGX_DEBUG_EVENT) | 278 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta); |
240 ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta); | 279 #endif |
241 #endif | 280 } |
281 | |
282 if (err) { | |
283 ngx_log_error(NGX_LOG_ALERT, log, err, "poll() failed"); | |
284 return NGX_ERROR; | |
285 } | |
242 | 286 |
243 nready = 0; | 287 nready = 0; |
244 | 288 |
245 for (i = 0; i < nevents && ready; i++) { | 289 for (i = 0; i < nevents && ready; i++) { |
246 c = &ngx_connections[event_list[i].fd]; | 290 c = &ngx_cycle->connections[event_list[i].fd]; |
291 | |
292 if (c->fd == -1) { | |
293 cycle = ngx_old_cycles.elts; | |
294 for (i = 0; i < ngx_old_cycles.nelts; i++) { | |
295 if (cycle[i] == NULL) { | |
296 continue; | |
297 } | |
298 c = &cycle[i]->connections[event_list[i].fd]; | |
299 if (c->fd != -1) { | |
300 break; | |
301 } | |
302 } | |
303 } | |
304 | |
305 if (c->fd == -1) { | |
306 ngx_log_error(NGX_LOG_ALERT, log, 0, "unkonwn cycle"); | |
307 exit(1); | |
308 } | |
247 | 309 |
248 #if (NGX_DEBUG_EVENT) | 310 #if (NGX_DEBUG_EVENT) |
249 ngx_log_debug(log, "poll: fd:%d, ev:%d, rev:%d" _ | 311 ngx_log_debug(log, "poll: fd:%d, ev:%d, rev:%d" _ |
250 event_list[i].fd _ | 312 event_list[i].fd _ |
251 event_list[i].events _ event_list[i].revents); | 313 event_list[i].events _ event_list[i].revents); |