Some bugfixes for the new signals support
authorPekka Riikonen <priikone@silcnet.org>
Wed, 20 Mar 2002 10:30:06 +0000 (10:30 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 20 Mar 2002 10:30:06 +0000 (10:30 +0000)
lib/silcutil/silcschedule.c
lib/silcutil/unix/silcunixschedule.c

index b7627350758bbada7b1b7fd05ff01422d85e850d..345381094e3036c94a160edc6afd38e2fa263505 100644 (file)
@@ -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. */
index ae2ce91210c5020102df09700c2d052f842fcafc..de64bd58b64e693203637ff0e3f9931ee310c9d5 100644 (file)
@@ -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. */