From a99a10531dd74835b7265e752307a80577e596b2 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 20 Mar 2002 10:30:06 +0000 Subject: [PATCH] Some bugfixes for the new signals support --- lib/silcutil/silcschedule.c | 14 ++++++++------ lib/silcutil/unix/silcunixschedule.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index b7627350..34538109 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -563,6 +563,14 @@ bool silc_schedule_one(SilcSchedule schedule, int timeout_usecs) if (!schedule->is_locked) SILC_SCHEDULE_LOCK(schedule); + /* Deliver signals if any has been set to be called */ + if (schedule->signal_tasks) { + SILC_SCHEDULE_UNLOCK(schedule); + silc_schedule_internal_signals_call(schedule->internal, schedule); + schedule->signal_tasks = FALSE; + SILC_SCHEDULE_LOCK(schedule); + } + /* If the task queues aren't initialized or we aren't valid anymore we will return */ if ((!schedule->fd_queue && !schedule->timeout_queue @@ -587,12 +595,6 @@ bool silc_schedule_one(SilcSchedule schedule, int timeout_usecs) SILC_SCHEDULE_UNLOCK(schedule); - /* Deliver signals if any has been set to be called */ - if (schedule->signal_tasks) { - silc_schedule_internal_signals_call(schedule->internal, schedule); - schedule->signal_tasks = FALSE; - } - /* This is the main select(). The program blocks here until some of the selected file descriptors change status or the selected timeout expires. */ diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index ae2ce912..de64bd58 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -171,15 +171,19 @@ void silc_schedule_internal_signal_register(void *context, SilcUnixScheduler internal = (SilcUnixScheduler)context; int i; + sigprocmask(SIG_BLOCK, &internal->signals, &internal->signals_blocked); + for (i = 0; i < SIGNAL_COUNT; i++) { if (!internal->signal_call[i].signal) { internal->signal_call[i].signal = signal; internal->signal_call[i].callback = callback; internal->signal_call[i].context = callback_context; internal->signal_call[i].call = FALSE; + break; } } + sigprocmask(SIG_SETMASK, &internal->signals_blocked, NULL); sigaddset(&internal->signals, signal); } @@ -191,6 +195,8 @@ void silc_schedule_internal_signal_unregister(void *context, SilcUnixScheduler internal = (SilcUnixScheduler)context; int i; + sigprocmask(SIG_BLOCK, &internal->signals, &internal->signals_blocked); + for (i = 0; i < SIGNAL_COUNT; i++) { if (internal->signal_call[i].signal == signal && internal->signal_call[i].callback == callback && @@ -202,6 +208,7 @@ void silc_schedule_internal_signal_unregister(void *context, } } + sigprocmask(SIG_SETMASK, &internal->signals_blocked, NULL); sigdelset(&internal->signals, signal); } @@ -212,10 +219,14 @@ void silc_schedule_internal_signal_call(void *context, SilcUInt32 signal) SilcUnixScheduler internal = (SilcUnixScheduler)context; int i; + sigprocmask(SIG_BLOCK, &internal->signals, &internal->signals_blocked); + for (i = 0; i < SIGNAL_COUNT; i++) { if (internal->signal_call[i].signal == signal) internal->signal_call[i].call = TRUE; } + + sigprocmask(SIG_SETMASK, &internal->signals_blocked, NULL); } /* Call all signals */ @@ -226,6 +237,8 @@ void silc_schedule_internal_signals_call(void *context, SilcUnixScheduler internal = (SilcUnixScheduler)context; int i; + sigprocmask(SIG_BLOCK, &internal->signals, &internal->signals_blocked); + for (i = 0; i < SIGNAL_COUNT; i++) { if (internal->signal_call[i].call && internal->signal_call[i].callback) { @@ -235,6 +248,8 @@ void silc_schedule_internal_signals_call(void *context, internal->signal_call[i].call = FALSE; } } + + sigprocmask(SIG_SETMASK, &internal->signals_blocked, NULL); } /* Block registered signals in scheduler. */ -- 2.24.0