comparison src/event/modules/ngx_kqueue_module.c @ 105:00bee6e7b485

nginx-0.0.1-2003-06-15-22:32:13 import
author Igor Sysoev <igor@sysoev.ru>
date Sun, 15 Jun 2003 18:32:13 +0000
parents 7e86d028d8f0
children 1c002f2b77ed
comparison
equal deleted inserted replaced
104:7db96f59bc29 105:00bee6e7b485
9 #include <ngx_event.h> 9 #include <ngx_event.h>
10 #include <ngx_kqueue_module.h> 10 #include <ngx_kqueue_module.h>
11 11
12 12
13 typedef struct { 13 typedef struct {
14 int changes; 14 u_int changes;
15 int events; 15 u_int events;
16 } ngx_kqueue_conf_t; 16 } ngx_kqueue_conf_t;
17 17
18 18
19 static int ngx_kqueue_init(ngx_log_t *log); 19 static int ngx_kqueue_init(ngx_log_t *log);
20 static void ngx_kqueue_done(ngx_log_t *log); 20 static void ngx_kqueue_done(ngx_log_t *log);
25 25
26 static void *ngx_kqueue_create_conf(ngx_pool_t *pool); 26 static void *ngx_kqueue_create_conf(ngx_pool_t *pool);
27 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf); 27 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf);
28 28
29 29
30 int ngx_kqueue; 30 int ngx_kqueue = -1;
31 31
32 static struct kevent *change_list, *event_list; 32 static struct kevent *change_list, *event_list;
33 static u_int max_changes, nchanges; 33 static u_int max_changes, nchanges, nevents;
34 static int nevents;
35 34
36 35
37 static ngx_str_t kqueue_name = ngx_string("kqueue"); 36 static ngx_str_t kqueue_name = ngx_string("kqueue");
38 37
39 static ngx_command_t ngx_kqueue_commands[] = { 38 static ngx_command_t ngx_kqueue_commands[] = {
84 }; 83 };
85 84
86 85
87 static int ngx_kqueue_init(ngx_log_t *log) 86 static int ngx_kqueue_init(ngx_log_t *log)
88 { 87 {
88 struct timespec ts;
89 ngx_kqueue_conf_t *kcf; 89 ngx_kqueue_conf_t *kcf;
90 90
91 kcf = ngx_event_get_conf(ngx_kqueue_module); 91 kcf = ngx_event_get_conf(ngx_kqueue_module);
92 92
93 ngx_log_debug(log, "CH: %d" _ kcf->changes); 93 ngx_log_debug(log, "CH: %d" _ kcf->changes);
94 ngx_log_debug(log, "EV: %d" _ kcf->events); 94 ngx_log_debug(log, "EV: %d" _ kcf->events);
95 95
96 if (ngx_kqueue == -1) {
97 ngx_kqueue = kqueue();
98
99 if (ngx_kqueue == -1) {
100 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed");
101 return NGX_ERROR;
102 }
103 }
104
105 if (max_changes < kcf->changes) {
106 if (nchanges) {
107 ts.tv_sec = 0;
108 ts.tv_nsec = 0;
109
110 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) {
111 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed");
112 return NGX_ERROR;
113 }
114 }
115
116 if (change_list) {
117 ngx_free(change_list);
118 }
119
120 ngx_test_null(change_list,
121 ngx_alloc(kcf->changes * sizeof(struct kevent), log),
122 NGX_ERROR);
123 }
124
96 max_changes = kcf->changes; 125 max_changes = kcf->changes;
126 nchanges = 0;
127
128 if (nevents < kcf->events) {
129 if (event_list) {
130 ngx_free(event_list);
131 }
132
133 ngx_test_null(event_list,
134 ngx_alloc(kcf->events * sizeof(struct kevent), log),
135 NGX_ERROR);
136 }
137
97 nevents = kcf->events; 138 nevents = kcf->events;
98 nchanges = 0;
99
100 ngx_kqueue = kqueue();
101
102 if (ngx_kqueue == -1) {
103 ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed");
104 return NGX_ERROR;
105 }
106
107 ngx_test_null(change_list,
108 ngx_alloc(kcf->changes * sizeof(struct kevent), log),
109 NGX_ERROR);
110 ngx_test_null(event_list,
111 ngx_alloc(kcf->events * sizeof(struct kevent), log),
112 NGX_ERROR);
113 139
114 if (ngx_event_timer_init(log) == NGX_ERROR) { 140 if (ngx_event_timer_init(log) == NGX_ERROR) {
115 return NGX_ERROR; 141 return NGX_ERROR;
116 } 142 }
143
144 /* TODO: re-add active events with new udata
145 if ecf->connections was increased */
117 146
118 ngx_event_actions = ngx_kqueue_module_ctx.actions; 147 ngx_event_actions = ngx_kqueue_module_ctx.actions;
119 148
120 ngx_event_flags = NGX_HAVE_LEVEL_EVENT 149 ngx_event_flags = NGX_HAVE_LEVEL_EVENT
121 |NGX_HAVE_ONESHOT_EVENT 150 |NGX_HAVE_ONESHOT_EVENT
137 { 166 {
138 if (close(ngx_kqueue) == -1) { 167 if (close(ngx_kqueue) == -1) {
139 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed"); 168 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kqueue close() failed");
140 } 169 }
141 170
171 ngx_kqueue = -1;
172
142 ngx_event_timer_done(log); 173 ngx_event_timer_done(log);
143 174
144 ngx_free(change_list); 175 ngx_free(change_list);
145 ngx_free(event_list); 176 ngx_free(event_list);
177
178 change_list = NULL;
179 event_list = NULL;
180 max_changes = 0;
181 nchanges = 0;
182 nevents = 0;
146 } 183 }
147 184
148 185
149 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags) 186 static int ngx_kqueue_add_event(ngx_event_t *ev, int event, u_int flags)
150 { 187 {
207 } 244 }
208 245
209 246
210 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) 247 static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
211 { 248 {
212 struct timespec ts; 249 struct timespec ts;
213 ngx_connection_t *c; 250 ngx_connection_t *c;
214 251
215 c = ev->data; 252 c = ev->data;
216 253
217 #if (NGX_DEBUG_EVENT) 254 #if (NGX_DEBUG_EVENT)
218 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d fl:%08x" _ 255 ngx_log_debug(ev->log, "kqueue set event: %d: ft:%d fl:%08x" _
225 262
226 ts.tv_sec = 0; 263 ts.tv_sec = 0;
227 ts.tv_nsec = 0; 264 ts.tv_nsec = 0;
228 265
229 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) { 266 if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) {
230 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent failed"); 267 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");
231 return NGX_ERROR; 268 return NGX_ERROR;
232 } 269 }
233 270
234 nchanges = 0; 271 nchanges = 0;
235 } 272 }
293 #endif 330 #endif
294 331
295 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp); 332 events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp);
296 333
297 if (events == -1) { 334 if (events == -1) {
298 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent failed"); 335 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed");
299 return NGX_ERROR; 336 return NGX_ERROR;
300 } 337 }
301 338
302 nchanges = 0; 339 nchanges = 0;
303 340
311 ngx_event_expire_timers(delta); 348 ngx_event_expire_timers(delta);
312 349
313 } else { 350 } else {
314 if (events == 0) { 351 if (events == 0) {
315 ngx_log_error(NGX_LOG_ALERT, log, 0, 352 ngx_log_error(NGX_LOG_ALERT, log, 0,
316 "kevent returns no events without timeout"); 353 "kevent() returned no events without timeout");
317 return NGX_ERROR; 354 return NGX_ERROR;
318 } 355 }
319 } 356 }
320 357
321 #if (NGX_DEBUG_EVENT) 358 #if (NGX_DEBUG_EVENT)
340 } 377 }
341 #endif 378 #endif
342 379
343 if (event_list[i].flags & EV_ERROR) { 380 if (event_list[i].flags & EV_ERROR) {
344 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, 381 ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data,
345 "kevent error on %d", event_list[i].ident); 382 "kevent() error on %d", event_list[i].ident);
346 continue; 383 continue;
347 } 384 }
348 385
349 ev = (ngx_event_t *) event_list[i].udata; 386 ev = (ngx_event_t *) event_list[i].udata;
350 387
412 449
413 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf) 450 static char *ngx_kqueue_init_conf(ngx_pool_t *pool, void *conf)
414 { 451 {
415 ngx_kqueue_conf_t *kcf = conf; 452 ngx_kqueue_conf_t *kcf = conf;
416 453
417 ngx_conf_init_value(kcf->changes, 512); 454 ngx_conf_init_unsigned_value(kcf->changes, 512);
418 ngx_conf_init_value(kcf->events, 512); 455 ngx_conf_init_unsigned_value(kcf->events, 512);
419 456
420 return NGX_CONF_OK; 457 return NGX_CONF_OK;
421 } 458 }