Use statically-allocated thread private data
[projects/chimara/chimara.git] / libchimara / timer.c
index f063defdbe60834dd1cf3c7a6fc55980560e5c6b..cebe6fe31c646820fdc02a2bc65dba6e0b0a3e2c 100644 (file)
@@ -1,6 +1,6 @@
 #include "timer.h"
 
-extern ChimaraGlkPrivate *glk_data;
+extern GPrivate glk_data_key;
 
 /**
  * glk_request_timer_events:
@@ -35,7 +35,7 @@ extern ChimaraGlkPrivate *glk_data;
  *  This prevents the user from being locked out by overly enthusiastic timer 
  *  events. Unfortunately, it also means that your timer can be locked out on 
  *  slower machines, if the player pounds too enthusiastically on the keyboard. 
- *  Sorry. If you want a real-time operating system, talk to Wind River.
+ *  Sorry.
  * </para></note>
  *
  * <note><para>
@@ -46,6 +46,8 @@ extern ChimaraGlkPrivate *glk_data;
 void
 glk_request_timer_events(glui32 millisecs)
 {
+       ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
        // Stop any existing timer
        if(glk_data->timer_id != 0) {
                g_source_remove(glk_data->timer_id);
@@ -55,7 +57,7 @@ glk_request_timer_events(glui32 millisecs)
        if(millisecs == 0)
                return;
        
-       glk_data->timer_id = g_timeout_add(millisecs, push_timer_event, NULL);
+       glk_data->timer_id = g_timeout_add(millisecs, (GSourceFunc)push_timer_event, glk_data->self);
 }
 
 /*
@@ -63,9 +65,9 @@ glk_request_timer_events(glui32 millisecs)
  * Will always return TRUE
  */
 gboolean
-push_timer_event(gpointer data)
+push_timer_event(ChimaraGlk *glk)
 {
-       event_throw(evtype_Timer, NULL, 0, 0);
+       event_throw(glk, evtype_Timer, NULL, 0, 0);
 
        return TRUE;
 }