a86ba68e2ddcc13714bef3c86975d84fddf30f2b
[crypto.git] / lib / silcutil / tests / test_silcschedule.c
1 /* SilcSchedule tests */
2
3 #include "silc.h"
4
5 typedef void (*Callback)(void *context);
6
7 #define NUM_TTASK 200
8 #ifdef FD_SETSIZE
9 #define NUM_FTASK FD_SETSIZE
10 #else
11 #define NUM_FTASK 250
12 #endif
13
14 SilcSchedule schedule;
15
16 void notify_cb(SilcSchedule schedule, SilcBool added, SilcTask task,
17                SilcBool fd_task, SilcUInt32 fd, long sec, long usec,
18                void *context)
19 {
20   SILC_LOG_DEBUG(("Notify cb, %s %s task, fd %d, sec %d usec %d",
21                   added ? "added" : "deleted", fd_task ? "fd" :"timeout",
22                   fd, sec, usec));
23 }
24
25 SILC_TASK_CALLBACK(foo)
26 {
27
28 }
29
30 SILC_TASK_CALLBACK(timeout)
31 {
32   int i = (int)context;
33   SILC_LOG_DEBUG(("Timeout task %d", i));
34 }
35
36 SILC_TASK_CALLBACK(cont2)
37 {
38 #ifdef SILC_DEBUG
39   silc_schedule_stats(schedule);
40 #endif /* SILC_DEBUG */
41
42   SILC_LOG_DEBUG(("Adding %d fd tasks", NUM_FTASK - 10));
43
44 #if 0
45   for (i = 0; i < NUM_FTASK - 10; i++)
46     silc_schedule_task_add_fd(schedule, i + 5, foo, (void *)(i + 5));
47 #endif
48 }
49
50 SILC_TASK_CALLBACK(cont)
51 {
52   int i;
53
54 #ifdef SILC_DEBUG
55   silc_schedule_stats(schedule);
56 #endif /* SILC_DEBUG */
57
58   SILC_LOG_DEBUG(("Adding %d timeout tasks", NUM_TTASK / 3));
59   for (i = 0; i < NUM_TTASK / 3; i++)
60     silc_schedule_task_add_timeout(schedule, timeout, (void *)i, 0, 0);
61
62   silc_schedule_task_add_timeout(schedule, cont2, (void *)i, 0, 100);
63 }
64
65 SILC_TASK_CALLBACK(start)
66 {
67   int i;
68
69   SILC_LOG_DEBUG(("Adding %d timeout tasks", NUM_TTASK));
70
71 #if 0
72   for (i = 0; i < NUM_TTASK; i++)
73     silc_schedule_task_add_timeout(schedule, timeout, (void *)i,
74         i + (i & 9999), (i * 720391) & 999999);
75 #endif
76
77   for (i = 0; i < NUM_TTASK; i++)
78     silc_schedule_task_add_timeout(schedule, timeout, (void *)i, 0, 1);
79
80   silc_schedule_task_add_timeout(schedule, cont, (void *)i, 0, 100);
81 }
82
83 SILC_TASK_CALLBACK(interrupt)
84 {
85   SILC_LOG_DEBUG(("SIGINT signal"));
86   silc_schedule_stop(schedule);
87 }
88
89 int main(int argc, char **argv)
90 {
91   SilcBool success = FALSE;
92
93   if (argc > 1 && !strcmp(argv[1], "-d")) {
94     silc_log_debug(TRUE);
95     silc_log_quick(TRUE);
96     silc_log_debug_hexdump(TRUE);
97     silc_log_set_debug_string("*sched*,*hash*,*errno*");
98   }
99
100   SILC_LOG_DEBUG(("Allocating scheduler"));
101   schedule = silc_schedule_init(NUM_FTASK, NULL, NULL);
102   if (!schedule)
103     goto err;
104   silc_schedule_set_notify(schedule, notify_cb, NULL);
105
106   silc_schedule_task_add_signal(schedule, SIGINT, interrupt, NULL);
107
108   silc_schedule_task_add_timeout(schedule, start, NULL, 1, 0);
109
110   SILC_LOG_DEBUG(("Running scheduler"));
111   silc_schedule(schedule);
112
113   silc_schedule_uninit(schedule);
114
115   success = TRUE;
116
117  err:
118   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
119   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
120
121   return success;
122 }