};
struct signal_handler {
- signal_handler_t *handler;
+ signal_handler_t *immediate_handler;
+ signal_handler_t *delayed_handler;
void *context;
enum libsig_flags flags;
saved_errno = errno;
for (h = signal_handlers[signo]; h != NULL; h = h->next) {
if ((h->flags & LIBSIG_FLAG_DELAYED) == 0)
- h->handler(si, h->context);
+ h->immediate_handler(si, h->context);
else if (pending_signals[signo].si_signo == 0) {
pending_signals[signo] = *si;
if (!have_pending_signals) {
}
/* handler can be called now */
h->shadowed = FALSE;
- h->handler(&sis[i], h->context);
+ h->delayed_handler(&sis[i], h->context);
}
if (!shadowed) {
/* no handlers are shadowed anymore; delete the signal
continue;
}
/* handler can be called now */
- h->handler(&signals[signo], h->context);
+ h->delayed_handler(&signals[signo], h->context);
}
if (shadowed) {
lib_signals_set(signo, flags);
h = i_new(struct signal_handler, 1);
- h->handler = handler;
+ if ((flags & LIBSIG_FLAG_DELAYED) == 0)
+ h->immediate_handler = handler;
+ else
+ h->delayed_handler = handler;
h->context = context;
h->flags = flags;
struct signal_handler *h, **p;
for (p = &signal_handlers[signo]; *p != NULL; p = &(*p)->next) {
- if ((*p)->handler == handler && (*p)->context == context) {
+ if (((*p)->immediate_handler == handler ||
+ (*p)->delayed_handler == handler) &&
+ (*p)->context == context) {
if (p == &signal_handlers[signo] &&
(*p)->next == NULL) {
/* last handler is to be removed */
struct signal_handler *h;
for (h = signal_handlers[signo]; h != NULL; h = h->next) {
- if (h->handler == handler && h->context == context) {
+ if ((h->immediate_handler == handler ||
+ h->delayed_handler == handler) && h->context == context) {
if (h->expected == expected)
return;
h->expected = expected;
struct signal_handler *h;
for (h = signal_handlers[signo]; h != NULL; h = h->next) {
- if (h->handler == handler && h->context == context) {
+ if (h->delayed_handler == handler && h->context == context) {
i_assert((h->flags & LIBSIG_FLAG_DELAYED) != 0);
i_assert((h->flags & LIBSIG_FLAG_IOLOOP_AUTOMOVE) == 0);
signal_handler_switch_ioloop(h);