Mark signals to be called when signal happens.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:50:24 +0000 (10:50 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:50:24 +0000 (10:50 +0000)
lib/silcutil/tests/test_silcschedule.c
lib/silcutil/unix/silcunixschedule.c

index 111f072749d027fdec2c0de76dac96db5b775766..8afbc9da5eef81f692143765b3aa3d45ccb4e40a 100644 (file)
@@ -71,6 +71,12 @@ SILC_TASK_CALLBACK(start)
   silc_schedule_task_add_timeout(schedule, cont, (void *)i, 0, 100);
 }
 
+SILC_TASK_CALLBACK(interrupt)
+{
+  SILC_LOG_DEBUG(("SIGINT signal"));
+  silc_schedule_stop(schedule);
+}
+
 int main(int argc, char **argv)
 {
   SilcBool success = FALSE;
@@ -87,6 +93,8 @@ int main(int argc, char **argv)
   if (!schedule)
     goto err;
 
+  silc_schedule_task_add_signal(schedule, SIGINT, interrupt, NULL);
+
   silc_schedule_task_add_timeout(schedule, start, NULL, 0, 1);
 
   SILC_LOG_DEBUG(("Running scheduler"));
index ccf410e9205fe4f07d38b5b1b00277629fc55a02..9372096170b2af53f2acf2e9ddefb4a7e7aef220 100644 (file)
@@ -45,6 +45,7 @@ typedef struct {
   SilcTaskCallback callback;
   void *context;
   SilcBool call;
+  SilcSchedule schedule;
 } SilcUnixSignal;
 
 #define SIGNAL_COUNT 32
@@ -213,6 +214,7 @@ void *silc_schedule_internal_init(SilcSchedule schedule,
                                  void *app_context)
 {
   SilcUnixScheduler internal;
+  int i;
 
   internal = silc_calloc(1, sizeof(*internal));
   if (!internal)
@@ -261,7 +263,11 @@ void *silc_schedule_internal_init(SilcSchedule schedule,
 
   internal->app_context = app_context;
 
-  memset(signal_call, 0, sizeof(signal_call) / sizeof(signal_call[0]));
+  for (i = 0; i < SIGNAL_COUNT; i++) {
+    signal_call[i].signal = 0;
+    signal_call[i].call = FALSE;
+    signal_call[i].schedule = schedule;
+  }
 
   return (void *)internal;
 }
@@ -317,6 +323,7 @@ static void silc_schedule_internal_sighandler(int signal)
   for (i = 0; i < SIGNAL_COUNT; i++) {
     if (signal_call[i].signal == signal) {
       signal_call[i].call = TRUE;
+      signal_call[i].schedule->signal_tasks = TRUE;
       SILC_LOG_DEBUG(("Scheduling signal %d to be called",
                      signal_call[i].signal));
       break;