X-Git-Url: http://git.silc.fi/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Funix%2Fsilcunixschedule.c;h=4fa48fbfc47528c7665efe1811536290de7725ea;hb=50c7d0d8c918d275751c9263cb64b6a3e847db67;hp=d81cfa751668172aa9d3789a7a51c26bac0a473a;hpb=60180da59ffdbbd12058dded66e3c8a547cd0852;p=runtime.git diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index d81cfa75..4fa48fbf 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1998 - 2007 Pekka Riikonen + Copyright (C) 1998 - 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,9 +16,8 @@ GNU General Public License for more details. */ -/* $Id$ */ -#include "silc.h" +#include "silcruntime.h" #if defined(HAVE_EPOLL_WAIT) #include @@ -55,7 +54,6 @@ typedef struct { } SilcUnixSignal; #define SIGNAL_COUNT 32 -SilcUnixSignal signal_call[SIGNAL_COUNT]; #if defined(HAVE_EPOLL_WAIT) @@ -288,6 +286,7 @@ SilcBool silc_schedule_internal_schedule_fd(SilcSchedule schedule, SILC_LOG_DEBUG(("epoll_ctl (DEL): %s", strerror(errno))); return FALSE; } + task->scheduled = FALSE; return TRUE; } @@ -352,6 +351,7 @@ void *silc_schedule_internal_init(SilcSchedule schedule, void *app_context) { SilcUnixScheduler internal; + SilcUnixSignal *signal_call; int i; internal = silc_scalloc(schedule->stack, 1, sizeof(*internal)); @@ -403,10 +403,17 @@ void *silc_schedule_internal_init(SilcSchedule schedule, internal->app_context = app_context; - for (i = 0; i < SIGNAL_COUNT; i++) { - signal_call[i].sig = 0; - signal_call[i].call = FALSE; - signal_call[i].schedule = schedule; + signal_call = silc_global_get_var("srtsignals", TRUE); + if (!signal_call) + signal_call = silc_global_set_var("srtsignals", + sizeof(*signal_call) * SIGNAL_COUNT, + NULL, TRUE); + if (signal_call) { + for (i = 0; i < SIGNAL_COUNT; i++) { + signal_call[i].sig = 0; + signal_call[i].call = FALSE; + signal_call[i].schedule = schedule; + } } return (void *)internal; @@ -437,6 +444,8 @@ void silc_schedule_internal_uninit(SilcSchedule schedule, void *context) #elif defined(HAVE_POLL) && defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE) silc_free(internal->fds); #endif /* HAVE_POLL && HAVE_SETRLIMIT && RLIMIT_NOFILE */ + + silc_global_del_var("srtsignals", TRUE); } /* Wakes up the scheduler */ @@ -460,6 +469,10 @@ void silc_schedule_internal_wakeup(SilcSchedule schedule, void *context) static void silc_schedule_internal_sighandler(int signal) { int i; + SilcUnixSignal *signal_call = silc_global_get_var("srtsignals", TRUE); + + if (!signal_call) + return; SILC_LOG_DEBUG(("Start")); @@ -481,9 +494,10 @@ void silc_schedule_internal_signal_register(SilcSchedule schedule, void *callback_context) { SilcUnixScheduler internal = (SilcUnixScheduler)context; + SilcUnixSignal *signal_call = silc_global_get_var("srtsignals", TRUE); int i; - if (!internal) + if (!internal || !signal_call) return; SILC_LOG_DEBUG(("Registering signal %d", sig)); @@ -511,9 +525,10 @@ void silc_schedule_internal_signal_unregister(SilcSchedule schedule, SilcUInt32 sig) { SilcUnixScheduler internal = (SilcUnixScheduler)context; + SilcUnixSignal *signal_call = silc_global_get_var("srtsignals", TRUE); int i; - if (!internal) + if (!internal || !signal_call) return; SILC_LOG_DEBUG(("Unregistering signal %d", sig)); @@ -540,11 +555,12 @@ void silc_schedule_internal_signal_unregister(SilcSchedule schedule, void silc_schedule_internal_signals_call(SilcSchedule schedule, void *context) { SilcUnixScheduler internal = (SilcUnixScheduler)context; + SilcUnixSignal *signal_call = silc_global_get_var("srtsignals", TRUE); int i; SILC_LOG_DEBUG(("Start")); - if (!internal) + if (!internal || !signal_call) return; silc_schedule_internal_signals_block(schedule, context);