Author: Pekka Riikonen <priikone@silcnet.org>
- 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
GNU General Public License for more details.
*/
-/* $Id$ */
-#include "silc.h"
+#include "silcruntime.h"
#if defined(HAVE_EPOLL_WAIT)
#include <sys/epoll.h>
} SilcUnixSignal;
#define SIGNAL_COUNT 32
-SilcUnixSignal signal_call[SIGNAL_COUNT];
#if defined(HAVE_EPOLL_WAIT)
SILC_LOG_DEBUG(("epoll_ctl (DEL): %s", strerror(errno)));
return FALSE;
}
+ task->scheduled = FALSE;
return TRUE;
}
void *app_context)
{
SilcUnixScheduler internal;
+ SilcUnixSignal *signal_call;
int i;
- internal = silc_calloc(1, sizeof(*internal));
+ internal = silc_scalloc(schedule->stack, 1, sizeof(*internal));
if (!internal)
return NULL;
#ifdef SILC_THREADS
if (pipe(internal->wakeup_pipe)) {
SILC_LOG_ERROR(("pipe() fails: %s", strerror(errno)));
- silc_free(internal);
return NULL;
}
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;
silc_free(internal->fds);
#endif /* HAVE_POLL && HAVE_SETRLIMIT && RLIMIT_NOFILE */
- silc_free(internal);
+ silc_global_del_var("srtsignals", TRUE);
}
/* Wakes up the scheduler */
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"));
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));
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));
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);