static int kq_sig_del(struct event_base *base, int nsignal, short old, short events, void *p) { struct kqop *kqop = base->evbase; struct kevent kev; struct timespec timeout = { 0, 0 }; (void)p; EVUTIL_ASSERT(nsignal >= 0 && nsignal < NSIG); memset(&kev, 0, sizeof(kev)); kev.ident = nsignal; kev.filter = EVFILT_SIGNAL; kev.flags = EV_DELETE; /* Because we insert signal events * immediately, we need to delete them * immediately, too */ if (kevent(kqop->kq, &kev, 1, NULL, 0, &timeout) == -1) return (-1); if (_evsig_restore_handler(base, nsignal) == -1) return (-1); return (0); }
void evsig_dealloc(struct event_base *base) { int i = 0; if (base->sig.ev_signal_added) { event_del(&base->sig.ev_signal); event_debug_unassign(&base->sig.ev_signal); base->sig.ev_signal_added = 0; } for (i = 0; i < NSIG; ++i) { if (i < base->sig.sh_old_max && base->sig.sh_old[i] != NULL) _evsig_restore_handler(base, i); } if (base->sig.ev_signal_pair[0] != -1) { EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[0]); base->sig.ev_signal_pair[0] = -1; } if (base->sig.ev_signal_pair[1] != -1) { EVUTIL_CLOSESOCKET(base->sig.ev_signal_pair[1]); base->sig.ev_signal_pair[1] = -1; } base->sig.sh_old_max = 0; /* per index frees are handled in evsig_del() */ if (base->sig.sh_old) { mm_free(base->sig.sh_old); base->sig.sh_old = NULL; } }
static int evsig_del(struct event_base *base, int evsignal, short old, short events, void *p) { EVUTIL_ASSERT(evsignal >= 0 && evsignal < NSIG); event_debug(("%s: %d: restoring signal handler", __func__, evsignal)); return (_evsig_restore_handler(base, evsignal)); }
static int evsig_del(struct event_base *base, evutil_socket_t evsignal, short old, short events, void *p) { EVUTIL_ASSERT(evsignal >= 0 && evsignal < NSIG); event_debug(("%s: %d: restoring signal handler", __func__, evsignal)); EVSIGBASE_LOCK(); --evsig_base_n_signals_added; --base->sig.ev_n_signals_added; EVSIGBASE_UNLOCK(); return (_evsig_restore_handler(base, (int)evsignal)); }
void evsig_dealloc(struct event_base *base) { int i = 0; if (base->sig.ev_signal_added) { event_del(&base->sig.ev_signal);//删除信号事件 base->sig.ev_signal_added = 0; } /* debug event is created in evsig_init/event_assign even when * ev_signal_added == 0, so unassign is required */ event_debug_unassign(&base->sig.ev_signal); //恢复所有的信号处理函数 for (i = 0; i < NSIG; ++i) { if (i < base->sig.sh_old_max && base->sig.sh_old[i] != NULL) _evsig_restore_handler(base, i); } EVSIGBASE_LOCK(); if (base == evsig_base) { evsig_base = NULL; evsig_base_n_signals_added = 0; evsig_base_fd = -1; } EVSIGBASE_UNLOCK(); //关闭socketpair描述府 if (base->sig.ev_signal_pair[0] != -1) { evutil_closesocket(base->sig.ev_signal_pair[0]); base->sig.ev_signal_pair[0] = -1; } if (base->sig.ev_signal_pair[1] != -1) { evutil_closesocket(base->sig.ev_signal_pair[1]); base->sig.ev_signal_pair[1] = -1; } base->sig.sh_old_max = 0; /* per index frees are handled in evsig_del() */ if (base->sig.sh_old) { mm_free(base->sig.sh_old); base->sig.sh_old = NULL; } }
void evsig_dealloc(struct event_base *base) { int i = 0; if (base->sig.ev_signal_added) { event_del(&base->sig.ev_signal); event_debug_unassign(&base->sig.ev_signal); base->sig.ev_signal_added = 0; } for (i = 0; i < NSIG; ++i) { if (i < base->sig.sh_old_max && base->sig.sh_old[i] != NULL) _evsig_restore_handler(base, i); } EVSIGBASE_LOCK(); if (base == evsig_base) { evsig_base = NULL; evsig_base_n_signals_added = 0; evsig_base_fd = -1; } EVSIGBASE_UNLOCK(); if (base->sig.ev_signal_pair[0] != -1) { evutil_closesocket(base->sig.ev_signal_pair[0]); base->sig.ev_signal_pair[0] = -1; } if (base->sig.ev_signal_pair[1] != -1) { evutil_closesocket(base->sig.ev_signal_pair[1]); base->sig.ev_signal_pair[1] = -1; } base->sig.sh_old_max = 0; /* per index frees are handled in evsig_del() */ if (base->sig.sh_old) { mm_free(base->sig.sh_old); base->sig.sh_old = NULL; } }