X-Git-Url: http://git.silcnet.org/gitweb/?p=crypto.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Ftests%2Ftest_silcschedule.c;h=28d2563245557ca800dc30ee7a764cd3a3553245;hp=a86ba68e2ddcc13714bef3c86975d84fddf30f2b;hb=60180da59ffdbbd12058dded66e3c8a547cd0852;hpb=687f7e441ffa2fa6a6726bc2851ca7c2c436be45 diff --git a/lib/silcutil/tests/test_silcschedule.c b/lib/silcutil/tests/test_silcschedule.c index a86ba68e..28d25632 100644 --- a/lib/silcutil/tests/test_silcschedule.c +++ b/lib/silcutil/tests/test_silcschedule.c @@ -12,10 +12,11 @@ typedef void (*Callback)(void *context); #endif SilcSchedule schedule; +int c = 0; void notify_cb(SilcSchedule schedule, SilcBool added, SilcTask task, - SilcBool fd_task, SilcUInt32 fd, long sec, long usec, - void *context) + SilcBool fd_task, SilcUInt32 fd, SilcTaskEvent event, + long sec, long usec, void *context) { SILC_LOG_DEBUG(("Notify cb, %s %s task, fd %d, sec %d usec %d", added ? "added" : "deleted", fd_task ? "fd" :"timeout", @@ -31,6 +32,10 @@ SILC_TASK_CALLBACK(timeout) { int i = (int)context; SILC_LOG_DEBUG(("Timeout task %d", i)); + + SILC_LOG_DEBUG(("Send 'timeout' signal")); + if (!silc_schedule_event_signal(NULL, "timeout", NULL)) + SILC_LOG_DEBUG(("Error sending signal, error %d", silc_errno)); } SILC_TASK_CALLBACK(cont2) @@ -82,13 +87,38 @@ SILC_TASK_CALLBACK(start) SILC_TASK_CALLBACK(interrupt) { - SILC_LOG_DEBUG(("SIGINT signal")); + SILC_LOG_DEBUG(("SIGINT signal, send 'interrupted' event signal")); + if (!silc_schedule_event_signal(schedule, "interrupted", NULL, + schedule)) + SILC_LOG_DEBUG(("Error sending signal, error %d", silc_errno)); +} + +SILC_TASK_EVENT_CALLBACK(timeout_event_cb) +{ + SILC_LOG_DEBUG(("timeout event signalled")); + if (c++ == 100) { + silc_schedule_task_del_event(NULL, "timeout"); + return FALSE; + } + + return TRUE; +} + +SILC_TASK_EVENT_CALLBACK(interrupted_event) +{ + SilcSchedule ptr = va_arg(va, void *); + SILC_LOG_DEBUG(("interrupted event signalled, ptr %p", ptr)); + silc_schedule_event_disconnect(NULL, "interrupted", NULL, + interrupted_event, NULL); silc_schedule_stop(schedule); + return TRUE; } int main(int argc, char **argv) { SilcBool success = FALSE; + SilcSchedule child, child2; + SilcTask timeout_event; if (argc > 1 && !strcmp(argv[1], "-d")) { silc_log_debug(TRUE); @@ -98,19 +128,56 @@ int main(int argc, char **argv) } SILC_LOG_DEBUG(("Allocating scheduler")); - schedule = silc_schedule_init(NUM_FTASK, NULL, NULL); + schedule = silc_schedule_init(NUM_FTASK, NULL, NULL, NULL); if (!schedule) goto err; silc_schedule_set_notify(schedule, notify_cb, NULL); + SILC_LOG_DEBUG(("Allocate child scheduler")); + child = silc_schedule_init(0, NULL, NULL, schedule); + if (!child) + goto err; + + SILC_LOG_DEBUG(("Allocate another child scheduler")); + child2 = silc_schedule_init(0, NULL, NULL, child); + if (!child2) + goto err; + + SILC_LOG_DEBUG(("Add 'interrupted' event to child scheduler")); + if (!silc_schedule_task_add_event(child, "interrupted", + SILC_PARAM_PTR)) + goto err; + + SILC_LOG_DEBUG(("Add 'timeout' event to parent scheduler")); + timeout_event = + silc_schedule_task_add_event(schedule, "timeout"); + if (!timeout_event) + goto err; + + SILC_LOG_DEBUG(("Connect to 'interrupted' event in parent scheduler")); + if (!silc_schedule_event_connect(schedule, "interrupted", NULL, + interrupted_event, NULL)) + goto err; + + SILC_LOG_DEBUG(("Connect to 'timeout' event in child2 scheduler")); + if (!silc_schedule_event_connect(child2, NULL, timeout_event, + timeout_event_cb, NULL)) + goto err; + + SILC_LOG_DEBUG(("Add parent as global scheduler")); + silc_schedule_set_global(schedule); + silc_schedule_task_add_signal(schedule, SIGINT, interrupt, NULL); - silc_schedule_task_add_timeout(schedule, start, NULL, 1, 0); + if (!silc_schedule_task_add_timeout(schedule, start, NULL, 1, 0)) + goto err; SILC_LOG_DEBUG(("Running scheduler")); silc_schedule(schedule); silc_schedule_uninit(schedule); + silc_schedule_uninit(child); + silc_schedule_uninit(child2); success = TRUE;