comparison src/event/modules/ngx_kqueue_module.c @ 372:c9fdfccebc49

nginx-0.0.7-2004-06-29-01:03:14 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 28 Jun 2004 21:03:14 +0000
parents 780e93985b93
children 018569a8f09c
comparison
equal deleted inserted replaced
371:780e93985b93 372:c9fdfccebc49
191 191
192 ev->active = 1; 192 ev->active = 1;
193 ev->disabled = 0; 193 ev->disabled = 0;
194 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; 194 ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
195 195
196 if (nchanges > 0 196 if (ngx_thread_main()
197 && nchanges > 0
197 && ev->index < (u_int) nchanges 198 && ev->index < (u_int) nchanges
198 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) 199 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
199 == (uintptr_t) ev) 200 == (uintptr_t) ev)
200 { 201 {
201 if (change_list[ev->index].flags == EV_DISABLE) { 202 if (change_list[ev->index].flags == EV_DISABLE) {
235 236
236 ev->active = 0; 237 ev->active = 0;
237 ev->disabled = 0; 238 ev->disabled = 0;
238 ev->posted = 0; 239 ev->posted = 0;
239 240
240 if (nchanges > 0 241 if (ngx_thread_main()
242 && nchanges > 0
241 && ev->index < (u_int) nchanges 243 && ev->index < (u_int) nchanges
242 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1) 244 && ((uintptr_t) change_list[ev->index].udata & (uintptr_t) ~1)
243 == (uintptr_t) ev) 245 == (uintptr_t) ev)
244 { 246 {
245 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, 247 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
278 280
279 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags) 281 static ngx_int_t ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
280 { 282 {
281 struct timespec ts; 283 struct timespec ts;
282 ngx_connection_t *c; 284 ngx_connection_t *c;
285 struct kevent *kev, kv;
283 286
284 c = ev->data; 287 c = ev->data;
285 288
286 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0, 289 ngx_log_debug3(NGX_LOG_DEBUG_EVENT, c->log, 0,
287 "kevent set event: %d: ft:%d fl:%04X", 290 "kevent set event: %d: ft:%d fl:%04X",
288 c->fd, filter, flags); 291 c->fd, filter, flags);
289 292
290 if (nchanges >= max_changes) { 293 if (ngx_thread_main() && nchanges >= max_changes) {
291 ngx_log_error(NGX_LOG_WARN, ev->log, 0, 294 ngx_log_error(NGX_LOG_WARN, ev->log, 0,
292 "kqueue change list is filled up"); 295 "kqueue change list is filled up");
293 296
294 ts.tv_sec = 0; 297 ts.tv_sec = 0;
295 ts.tv_nsec = 0; 298 ts.tv_nsec = 0;
300 } 303 }
301 304
302 nchanges = 0; 305 nchanges = 0;
303 } 306 }
304 307
305 change_list[nchanges].ident = c->fd; 308 kev = ngx_thread_main() ? &change_list[nchanges] : &kv;
306 change_list[nchanges].filter = filter; 309
307 change_list[nchanges].flags = flags; 310 kev->ident = c->fd;
308 change_list[nchanges].udata = (void *) ((uintptr_t) ev | ev->instance); 311 kev->filter = filter;
312 kev->flags = flags;
313 kev->udata = (void *) ((uintptr_t) ev | ev->instance);
309 314
310 if (filter == EVFILT_VNODE) { 315 if (filter == EVFILT_VNODE) {
311 change_list[nchanges].fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND 316 kev->fflags = NOTE_DELETE|NOTE_WRITE|NOTE_EXTEND
312 |NOTE_ATTRIB|NOTE_RENAME 317 |NOTE_ATTRIB|NOTE_RENAME
313 #if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \ 318 #if (__FreeBSD__ == 4 && __FreeBSD_version >= 430000) \
314 || __FreeBSD_version >= 500018 319 || __FreeBSD_version >= 500018
315 |NOTE_REVOKE 320 |NOTE_REVOKE
316 #endif 321 #endif
317 ; 322 ;
318 change_list[nchanges].data = 0; 323 kev->data = 0;
319 324
320 } else { 325 } else {
321 #if (HAVE_LOWAT_EVENT) 326 #if (HAVE_LOWAT_EVENT)
322 if (flags & NGX_LOWAT_EVENT) { 327 if (flags & NGX_LOWAT_EVENT) {
323 change_list[nchanges].fflags = NOTE_LOWAT; 328 kev->fflags = NOTE_LOWAT;
324 change_list[nchanges].data = ev->available; 329 kev->data = ev->available;
325 330
326 } else { 331 } else {
327 change_list[nchanges].fflags = 0; 332 kev->fflags = 0;
328 change_list[nchanges].data = 0; 333 kev->data = 0;
329 } 334 }
330 #else 335 #else
331 change_list[nchanges].fflags = 0; 336 kev->fflags = 0;
332 change_list[nchanges].data = 0; 337 kev->data = 0;
333 #endif 338 #endif
334 } 339 }
335 340
336 ev->index = nchanges; 341 if (ngx_thread_main()) {
337 342 ev->index = nchanges;
338 nchanges++; 343 nchanges++;
344
345 } else {
346 ts.tv_sec = 0;
347 ts.tv_nsec = 0;
348
349 if (kevent(ngx_kqueue, &kv, 1, NULL, 0, &ts) == -1) {
350 ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno, "kevent() failed");
351 return NGX_ERROR;
352 }
353 }
339 354
340 return NGX_OK; 355 return NGX_OK;
341 } 356 }
342 357
343 358