1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7#include <nxt_main.h>
8

--- 180 unchanged lines hidden (view full) ---

189
190 engine->u.kqueue.events = nxt_malloc(sizeof(struct kevent) * mevents);
191 if (engine->u.kqueue.events == NULL) {
192 goto fail;
193 }
194
195 engine->u.kqueue.fd = kqueue();
196 if (engine->u.kqueue.fd == -1) {
197 nxt_log(&engine->task, NXT_LOG_CRIT, "kqueue() failed %E", nxt_errno);
197 nxt_alert(&engine->task, "kqueue() failed %E", nxt_errno);
198 goto fail;
199 }
200
201 nxt_debug(&engine->task, "kqueue(): %d", engine->u.kqueue.fd);
202
203 if (engine->signals != NULL) {
204 for (sigev = engine->signals->sigev; sigev->signo != 0; sigev++) {
205 if (nxt_kqueue_add_signal(engine, sigev) != NXT_OK) {

--- 20 unchanged lines hidden (view full) ---

226 fd = engine->u.kqueue.fd;
227
228 nxt_debug(&engine->task, "kqueue %d free", fd);
229
230 if (fd != -1 && engine->u.kqueue.pid == nxt_pid) {
231 /* kqueue is not inherited by fork() */
232
233 if (close(fd) != 0) {
234 nxt_log(&engine->task, NXT_LOG_CRIT, "kqueue close(%d) failed %E",
235 fd, nxt_errno);
234 nxt_alert(&engine->task, "kqueue close(%d) failed %E",
235 fd, nxt_errno);
236 }
237 }
238
239 nxt_free(engine->u.kqueue.events);
240 nxt_free(engine->u.kqueue.changes);
241
242 nxt_memzero(&engine->u.kqueue, sizeof(nxt_kqueue_engine_t));
243}

--- 229 unchanged lines hidden (view full) ---

473
474 nxt_debug(&engine->task, "kevent(%d) changes:%d",
475 engine->u.kqueue.fd, nchanges);
476
477 ret = kevent(engine->u.kqueue.fd, engine->u.kqueue.changes, nchanges,
478 NULL, 0, NULL);
479
480 if (nxt_slow_path(ret != 0)) {
481 nxt_log(&engine->task, NXT_LOG_CRIT, "kevent(%d) failed %E",
482 engine->u.kqueue.fd, nxt_errno);
481 nxt_alert(&engine->task, "kevent(%d) failed %E",
482 engine->u.kqueue.fd, nxt_errno);
483
484 nxt_kqueue_error(engine);
485 }
486
487 engine->u.kqueue.nchanges = 0;
488 }
489
490 return &engine->u.kqueue.changes[engine->u.kqueue.nchanges++];

--- 85 unchanged lines hidden (view full) ---

576 * SIGCHLD must not be set to SIG_IGN, since kqueue cannot catch
577 * this signal. It should be set to SIG_DFL instead. And although
578 * SIGCHLD default action is also ignoring, nevertheless SIG_DFL
579 * allows kqueue to catch the signal.
580 */
581 sa.sa_handler = (signo == SIGCHLD) ? SIG_DFL : SIG_IGN;
582
583 if (sigaction(signo, &sa, NULL) != 0) {
584 nxt_log(&engine->task, NXT_LOG_CRIT, "sigaction(%d) failed %E",
585 signo, nxt_errno);
584 nxt_alert(&engine->task, "sigaction(%d) failed %E", signo, nxt_errno);
585
586 return NXT_ERROR;
587 }
588
589 nxt_debug(&engine->task, "kevent(%d) signo:%d (%s)",
590 engine->u.kqueue.fd, signo, sigev->name);
591
592 kev.ident = signo;
593 kev.filter = EVFILT_SIGNAL;
594 kev.flags = EV_ADD;
595 kev.fflags = 0;
596 kev.data = 0;
597 kev.udata = nxt_kevent_set_udata(sigev);
598
599 if (kevent(engine->u.kqueue.fd, &kev, 1, NULL, 0, NULL) == 0) {
600 return NXT_OK;
601 }
602
604 nxt_log(&engine->task, NXT_LOG_CRIT, "kevent(%d) failed %E",
605 kqueue, nxt_errno);
603 nxt_alert(&engine->task, "kevent(%d) failed %E", kqueue, nxt_errno);
604
605 return NXT_ERROR;
606}
607
608
609#if (NXT_HAVE_EVFILT_USER)
610
611static nxt_int_t

--- 11 unchanged lines hidden (view full) ---

623 kev.udata = NULL;
624
625 engine->u.kqueue.post_handler = handler;
626
627 if (kevent(engine->u.kqueue.fd, &kev, 1, NULL, 0, NULL) == 0) {
628 return NXT_OK;
629 }
630
633 nxt_log(&engine->task, NXT_LOG_CRIT, "kevent(%d) failed %E",
634 engine->u.kqueue.fd, nxt_errno);
631 nxt_alert(&engine->task, "kevent(%d) failed %E",
632 engine->u.kqueue.fd, nxt_errno);
633
634 return NXT_ERROR;
635}
636
637
638static void
639nxt_kqueue_signal(nxt_event_engine_t *engine, nxt_uint_t signo)
640{

--- 7 unchanged lines hidden (view full) ---

648 kev.ident = 0;
649 kev.filter = EVFILT_USER;
650 kev.flags = 0;
651 kev.fflags = NOTE_TRIGGER;
652 kev.data = 0;
653 kev.udata = NULL;
654
655 if (kevent(engine->u.kqueue.fd, &kev, 1, NULL, 0, NULL) != 0) {
658 nxt_log(&engine->task, NXT_LOG_CRIT, "kevent(%d) failed %E",
659 engine->u.kqueue.fd, nxt_errno);
656 nxt_alert(&engine->task, "kevent(%d) failed %E",
657 engine->u.kqueue.fd, nxt_errno);
658 }
659}
660
661#endif
662
663
664static void
665nxt_kqueue_poll(nxt_event_engine_t *engine, nxt_msec_t timeout)

--- 31 unchanged lines hidden (view full) ---

697
698 err = (nevents == -1) ? nxt_errno : 0;
699
700 nxt_thread_time_update(engine->task.thread);
701
702 nxt_debug(&engine->task, "kevent(%d): %d", engine->u.kqueue.fd, nevents);
703
704 if (nevents == -1) {
707 level = (err == NXT_EINTR) ? NXT_LOG_INFO : NXT_LOG_CRIT;
705 level = (err == NXT_EINTR) ? NXT_LOG_INFO : NXT_LOG_ALERT;
706
707 nxt_log(&engine->task, level, "kevent(%d) failed %E",
708 engine->u.kqueue.fd, err);
709
710 nxt_kqueue_error(engine);
711 return;
712 }
713

--- 8 unchanged lines hidden (view full) ---

722 "kevent: id:%p ft:%d fl:%04Xd ff:%d d:%d ud:%p":
723 "kevent: id:%d ft:%d fl:%04Xd ff:%d d:%d ud:%p",
724 kev->ident, kev->filter, kev->flags, kev->fflags,
725 kev->data, kev->udata);
726
727 error = (kev->flags & EV_ERROR);
728
729 if (nxt_slow_path(error)) {
732 nxt_log(&engine->task, NXT_LOG_CRIT,
733 "kevent(%d) error %E on ident:%d filter:%d",
734 engine->u.kqueue.fd, kev->data, kev->ident, kev->filter);
730 nxt_alert(&engine->task,
731 "kevent(%d) error %E on ident:%d filter:%d",
732 engine->u.kqueue.fd, kev->data, kev->ident, kev->filter);
733 }
734
735 task = &engine->task;
736 wq = &engine->fast_work_queue;
737 handler = nxt_kqueue_fd_error_handler;
738 obj = nxt_kevent_get_udata(kev->udata);
739
740 switch (kev->filter) {

--- 82 unchanged lines hidden (view full) ---

823 data = NULL;
824 break;
825
826#endif
827
828 default:
829
830#if (NXT_DEBUG)
833 nxt_log(&engine->task, NXT_LOG_CRIT,
834 "unexpected kevent(%d) filter %d on ident %d",
835 engine->u.kqueue.fd, kev->filter, kev->ident);
831 nxt_alert(&engine->task,
832 "unexpected kevent(%d) filter %d on ident %d",
833 engine->u.kqueue.fd, kev->filter, kev->ident);
834#endif
835
836 continue;
837 }
838
839 nxt_work_queue_add(wq, handler, task, obj, data);
840 }
841}

--- 185 unchanged lines hidden ---