3
3
4
4
uiInitOptions uiprivOptions ;
5
5
6
+ static GHashTable * timers ;
7
+
6
8
const char * uiInit (uiInitOptions * o )
7
9
{
8
10
GError * err = NULL ;
@@ -16,11 +18,21 @@ const char *uiInit(uiInitOptions *o)
16
18
}
17
19
uiprivInitAlloc ();
18
20
uiprivLoadFutures ();
21
+ timers = g_hash_table_new (g_direct_hash , g_direct_equal );
19
22
return NULL ;
20
23
}
21
24
25
+ struct timer ; // TODO get rid of forward declaration
26
+
27
+ static void uninitTimer (gpointer key , gpointer value , gpointer data )
28
+ {
29
+ uiprivFree ((struct timer * ) key );
30
+ }
31
+
22
32
void uiUninit (void )
23
33
{
34
+ g_hash_table_foreach (timers , uninitTimer , NULL );
35
+ g_hash_table_destroy (timers );
24
36
uiprivUninitMenus ();
25
37
uiprivUninitAlloc ();
26
38
}
@@ -108,27 +120,29 @@ void uiQueueMain(void (*f)(void *data), void *data)
108
120
}
109
121
110
122
struct timer {
111
- int (* f )(void * );
112
- void * data ;
123
+ int (* f )(void * );
124
+ void * data ;
113
125
};
114
126
115
127
static gboolean doTimer (gpointer data )
116
128
{
117
- struct timer * t = (struct timer * ) data ;
129
+ struct timer * t = (struct timer * ) data ;
118
130
119
- if (!(* (t -> f ))(t -> data )) {
120
- uiprivFree (t );
121
- return FALSE;
122
- }
131
+ if (!(* (t -> f ))(t -> data )) {
132
+ g_hash_table_remove (timers , t );
133
+ uiprivFree (t );
134
+ return FALSE;
135
+ }
123
136
return TRUE;
124
137
}
125
138
126
139
void uiTimer (int milliseconds , int (* f )(void * data ), void * data )
127
140
{
128
- struct timer * t ;
141
+ struct timer * t ;
129
142
130
- t = uiprivNew (struct timer );
131
- t -> f = f ;
132
- t -> data = data ;
133
- g_timeout_add (milliseconds , doTimer , t );
143
+ t = uiprivNew (struct timer );
144
+ t -> f = f ;
145
+ t -> data = data ;
146
+ g_timeout_add (milliseconds , doTimer , t );
147
+ g_hash_table_add (timers , t );
134
148
}
0 commit comments