Added SILC Thread Queue API
[silc.git] / lib / silcacc / silcacc.c
1 /*
2
3   silcacc.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 2007 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18 */
19
20 #include "silc.h"
21 #include "softacc.h"
22
23 /************************** Types and definitions ***************************/
24
25 #ifndef SILC_SYMBIAN
26 /* Dynamically registered list of accelerators. */
27 SilcDList silc_acc_list = NULL;
28 #endif /* SILC_SYMBIAN */
29
30 /* Static list of accelerators */
31 const SilcAcceleratorStruct *silc_default_accs[] =
32 {
33 #ifndef SILC_SYMBIAN
34   /* Software accelerator */
35   &softacc,
36 #endif /* SILC_SYMBIAN */
37   NULL
38 };
39
40 /*************************** SILC Accelerator API ***************************/
41
42 /* Register accelerator */
43
44 SilcBool silc_acc_register(const SilcAccelerator acc)
45 {
46   if (!acc)
47     return FALSE;
48
49   if (!silc_acc_list) {
50     silc_acc_list = silc_dlist_init();
51     if (!silc_acc_list)
52       return FALSE;
53   }
54
55   SILC_LOG_DEBUG(("Register accelerator %p, name %s", acc, acc->name));
56   silc_dlist_add(silc_acc_list, acc);
57
58   return TRUE;
59 }
60
61 /* Unregister accelerator */
62
63 void silc_acc_unregister(SilcAccelerator acc)
64 {
65   if (!acc)
66     return;
67
68   if (!silc_acc_list)
69     return;
70
71   SILC_LOG_DEBUG(("Unregister accelerator %p, name %s", acc, acc->name));
72   silc_dlist_del(silc_acc_list, acc);
73
74   if (!silc_dlist_count(silc_acc_list)) {
75     silc_dlist_uninit(silc_acc_list);
76     silc_acc_list = NULL;
77   }
78 }
79
80 /* Initialize accelerator */
81
82 SilcBool silc_acc_init(SilcAccelerator acc, SilcSchedule schedule, ...)
83 {
84   va_list va;
85   SilcBool ret;
86
87   if (!acc || !schedule)
88     return FALSE;
89
90   SILC_LOG_DEBUG(("Initialize accelerator %p, name %s", acc, acc->name));
91
92   va_start(va, schedule);
93   ret = acc->init(schedule, va);
94   va_end(va);
95
96   return ret;
97 }
98
99 /* Uninitialize accelerator */
100
101 SilcBool silc_acc_uninit(SilcAccelerator acc)
102 {
103   if (!acc)
104     return FALSE;
105
106   SILC_LOG_DEBUG(("Uninitialize accelerator %p, name %s", acc, acc->name));
107   return acc->uninit();
108 }
109
110 /* Get list of registered accelerator */
111
112 SilcDList silc_acc_get_supported(void)
113 {
114   SilcDList list;
115   SilcAccelerator acc;
116   int i;
117
118   list = silc_dlist_init();
119   if (!list)
120     return NULL;
121
122   if (silc_acc_list) {
123     silc_dlist_start(silc_acc_list);
124     while ((acc = silc_dlist_get(silc_acc_list)))
125       silc_dlist_add(list, acc);
126   }
127
128   for (i = 0; silc_default_accs[i]->name; i++)
129     silc_dlist_add(list, (void *)silc_default_accs[i]);
130
131   return list;
132 }
133
134 /* Get accelerator */
135
136 SilcAccelerator silc_acc_find(const char *name)
137 {
138   SilcAccelerator acc;
139   int i;
140
141   if (!name)
142     return NULL;
143
144   SILC_LOG_DEBUG(("Find accelerator %s", name));
145
146   if (silc_acc_list) {
147     silc_dlist_start(silc_acc_list);
148     while ((acc = silc_dlist_get(silc_acc_list))) {
149       if (!strcmp(acc->name, name)) {
150         SILC_LOG_DEBUG(("Found accelerator %p", acc));
151         return acc;
152       }
153     }
154   }
155
156   for (i = 0; silc_default_accs[i]->name; i++) {
157     if (!strcmp(silc_default_accs[i]->name, name)) {
158       SILC_LOG_DEBUG(("Found accelerator %p", silc_default_accs[i]));
159       return (SilcAccelerator)silc_default_accs[i];
160     }
161   }
162
163   SILC_LOG_DEBUG(("Accelerator %s does not exist", name));
164   return NULL;
165 }
166
167 /* Get accelerator name */
168
169 const char *silc_acc_get_name(SilcAccelerator acc)
170 {
171   if (!acc)
172     return NULL;
173   return acc->name;
174 }