comparison src/event/modules/ngx_kqueue_module.c @ 218:05592fd7a436

nginx-0.0.1-2004-01-05-23:55:48 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 05 Jan 2004 20:55:48 +0000
parents f536f91e8e99
children 1119faf4635a
comparison
equal deleted inserted replaced
217:c5d1cdcb04ec 218:05592fd7a436
90 struct timespec ts; 90 struct timespec ts;
91 ngx_kqueue_conf_t *kcf; 91 ngx_kqueue_conf_t *kcf;
92 92
93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module); 93 kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
94 94
95 ngx_log_debug(cycle->log, "CH: %d" _ kcf->changes);
96 ngx_log_debug(cycle->log, "EV: %d" _ kcf->events);
97
98 if (ngx_kqueue == -1) { 95 if (ngx_kqueue == -1) {
99 ngx_kqueue = kqueue(); 96 ngx_kqueue = kqueue();
100 97
101 if (ngx_kqueue == -1) { 98 if (ngx_kqueue == -1) {
102 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, 99 ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
194 { 191 {
195 ngx_event_t *e; 192 ngx_event_t *e;
196 ngx_connection_t *c; 193 ngx_connection_t *c;
197 194
198 ev->active = 1; 195 ev->active = 1;
196 ev->disabled = 0;
199 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; 197 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
200 198
201 if (nchanges > 0 199 if (nchanges > 0
202 && ev->index < (u_int) nchanges 200 && ev->index < (u_int) nchanges
203 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) 201 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
204 == (uintptr_t) ev) 202 == (uintptr_t) ev)
205 { 203 {
206 if (change_list[ev->index].flags == EV_DISABLE) { 204 if (change_list[ev->index].flags == EV_DISABLE) {
207 205
208 #if (NGX_DEBUG_EVENT) 206 /*
209 ngx_connection_t *c = (ngx_connection_t *) ev->data; 207 * if the EV_DISABLE is still not passed to a kernel
210 ngx_log_debug(ev->log, "kqueue event activated: %d: ft:%d" _ 208 * we will not pass it
211 c->fd _ event); 209 */
212 #endif 210
213 211 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
214 /* 212 "kevent activated: %d: ft:%d",
215 * if the EV_DISABLE is still not passed to a kernel 213 ngx_event_ident(ev->data), event);
216 * we will not pass it
217 */
218 214
219 if (ev->index < (u_int) --nchanges) { 215 if (ev->index < (u_int) --nchanges) {
220 e = (ngx_event_t *) change_list[nchanges].udata; 216 e = (ngx_event_t *) change_list[nchanges].udata;
221 change_list[ev->index] = change_list[nchanges]; 217 change_list[ev->index] = change_list[nchanges];
222 e->index = ev->index; 218 e->index = ev->index;
239 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags) 235 static int ngx_kqueue_del_event(ngx_event_t *ev, int event, u_int flags)
240 { 236 {
241 ngx_event_t *e; 237 ngx_event_t *e;
242 238
243 ev->active = 0; 239 ev->active = 0;
240 ev->disabled = 0;
244 241
245 if (nchanges > 0 242 if (nchanges > 0
246 && ev->index < (u_int) nchanges 243 && ev->index < (u_int) nchanges
247 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) 244 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
248 == (uintptr_t) ev) 245 == (uintptr_t) ev)
249 { 246 {
250 #if (NGX_DEBUG_EVENT) 247 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
251 ngx_connection_t *c = (ngx_connection_t *) ev->data; 248 "kevent deleted: %d: ft:%d",
252 ngx_log_debug(ev->log, "kqueue event deleted: %d: ft:%d" _ 249 ngx_event_ident(ev->data), event);
253 c->fd _ event);
254 #endif
255 250
256 /* if the event is still not passed to a kernel we will not pass it */ 251 /* if the event is still not passed to a kernel we will not pass it */
257 252
258 if (ev->index < (u_int) --nchanges) { 253 if (ev->index < (u_int) --nchanges) {
259 e = (ngx_event_t *) change_list[nchanges].udata; 254 e = (ngx_event_t *) change_list[nchanges].udata;
270 * before the closing the file descriptor. 265 * before the closing the file descriptor.
271 */ 266 */
272 267
273 if (flags & NGX_CLOSE_EVENT) { 268 if (flags & NGX_CLOSE_EVENT) {
274 return NGX_OK; 269 return NGX_OK;
270 }
271
272 if (flags & NGX_DISABLE_EVENT) {
273 ev->disabled = 1;
275 } 274 }
276 275
277 return ngx_kqueue_set_event(ev, event, 276 return ngx_kqueue_set_event(ev, event,
278 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE); 277 flags & NGX_DISABLE_EVENT ? EV_DISABLE : EV_DELETE);
279 } 278 }
344 } 343 }
345 344
346 345
347 static int ngx_kqueue_process_events(ngx_log_t *log) 346 static int ngx_kqueue_process_events(ngx_log_t *log)
348 { 347 {
349 int events, instance, i; 348 ngx_int_t events, instance, i;
350 ngx_err_t err; 349 ngx_err_t err;
351 ngx_msec_t timer; 350 ngx_msec_t timer;
352 ngx_event_t *ev; 351 ngx_event_t *ev;
353 ngx_epoch_msec_t delta; 352 ngx_epoch_msec_t delta;
354 struct timeval tv; 353 struct timeval tv;
389 #if 1 388 #if 1
390 delta = ngx_elapsed_msec; 389 delta = ngx_elapsed_msec;
391 #endif 390 #endif
392 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; 391 ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
393 392
394 if (ngx_cached_time != tv.tv_sec) { 393 ngx_time_update(tv.tv_sec);
395 ngx_cached_time = tv.tv_sec;
396 ngx_time_update();
397 }
398 394
399 if (timer) { 395 if (timer) {
400 delta = ngx_elapsed_msec - delta; 396 delta = ngx_elapsed_msec - delta;
401 397
402 } else { 398 } else {
405 "kevent() returned no events without timeout"); 401 "kevent() returned no events without timeout");
406 return NGX_ERROR; 402 return NGX_ERROR;
407 } 403 }
408 } 404 }
409 405
410 #if (NGX_DEBUG_EVENT) 406 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
411 ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); 407 "kevent timer: %d, delta: %d", timer, (int) delta);
412 #endif
413 408
414 if (err) { 409 if (err) {
415 ngx_log_error(NGX_LOG_ALERT, log, err, "kevent() failed"); 410 ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
411 log, err, "kevent() failed");
416 return NGX_ERROR; 412 return NGX_ERROR;
417 } 413 }
418 414
419 for (i = 0; i < events; i++) { 415 for (i = 0; i < events; i++) {
420 416