From: Pekka Riikonen Date: Sun, 22 Oct 2006 10:50:24 +0000 (+0000) Subject: Mark signals to be called when signal happens. X-Git-Tag: 1.2.beta1~673 X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=commitdiff_plain;h=269b3761baedc9042aa77b5312a00d94607e4808 Mark signals to be called when signal happens. --- diff --git a/lib/silcutil/tests/test_silcschedule.c b/lib/silcutil/tests/test_silcschedule.c index 111f0727..8afbc9da 100644 --- a/lib/silcutil/tests/test_silcschedule.c +++ b/lib/silcutil/tests/test_silcschedule.c @@ -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")); diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index ccf410e9..93720961 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -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;