X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Ftests%2Ftest_silcschedule.c;h=28d2563245557ca800dc30ee7a764cd3a3553245;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hp=111f072749d027fdec2c0de76dac96db5b775766;hpb=2be21c834d932b3e5eb780c9b746a26387f56760;p=silc.git diff --git a/lib/silcutil/tests/test_silcschedule.c b/lib/silcutil/tests/test_silcschedule.c index 111f0727..28d25632 100644 --- a/lib/silcutil/tests/test_silcschedule.c +++ b/lib/silcutil/tests/test_silcschedule.c @@ -12,6 +12,16 @@ 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, 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", + fd, sec, usec)); +} SILC_TASK_CALLBACK(foo) { @@ -22,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) @@ -48,7 +62,7 @@ SILC_TASK_CALLBACK(cont) SILC_LOG_DEBUG(("Adding %d timeout tasks", NUM_TTASK / 3)); for (i = 0; i < NUM_TTASK / 3; i++) - silc_schedule_task_add_timeout(schedule, timeout, (void *)i, 0, 1); + silc_schedule_task_add_timeout(schedule, timeout, (void *)i, 0, 0); silc_schedule_task_add_timeout(schedule, cont2, (void *)i, 0, 100); } @@ -71,28 +85,99 @@ SILC_TASK_CALLBACK(start) silc_schedule_task_add_timeout(schedule, cont, (void *)i, 0, 100); } +SILC_TASK_CALLBACK(interrupt) +{ + 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); silc_log_quick(TRUE); silc_log_debug_hexdump(TRUE); - silc_log_set_debug_string("*sched*,*hash*"); + silc_log_set_debug_string("*sched*,*hash*,*errno*"); } SILC_LOG_DEBUG(("Allocating scheduler")); - schedule = silc_schedule_init(NUM_FTASK, NULL); + schedule = silc_schedule_init(NUM_FTASK, NULL, NULL, NULL); if (!schedule) goto err; + silc_schedule_set_notify(schedule, notify_cb, NULL); - silc_schedule_task_add_timeout(schedule, start, NULL, 0, 1); + 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); + + 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;