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