Use statically-allocated thread private data
[projects/chimara/chimara.git] / libchimara / event.c
index 7c916c073b5b8e4eef94b41dd387389f876c653c..18f7281bfa9899dd71d0e385e4107b66eb11bcdb 100644 (file)
@@ -8,7 +8,7 @@
 #include "chimara-glk.h"
 #include "chimara-glk-private.h"
 
-extern GPrivate *glk_data_key;
+extern GPrivate glk_data_key;
 
 #define EVENT_TIMEOUT_MICROSECONDS (3000000)
 
@@ -23,17 +23,15 @@ event_throw(ChimaraGlk *glk, glui32 type, winid_t win, glui32 val1, glui32 val2)
        if(!priv->event_queue)
                return;
 
-       GTimeVal timeout;
-       g_get_current_time(&timeout);
-       g_time_val_add(&timeout, EVENT_TIMEOUT_MICROSECONDS);
+       gint64 timeout = g_get_monotonic_time() + EVENT_TIMEOUT_MICROSECONDS;
 
        g_mutex_lock(&priv->event_lock);
 
        /* Wait for room in the event queue */
        while( g_queue_get_length(priv->event_queue) >= EVENT_QUEUE_MAX_LENGTH )
-               if( !g_cond_timed_wait(&priv->event_queue_not_full, &priv->event_lock, &timeout) ) 
+               if( !g_cond_wait_until(&priv->event_queue_not_full, &priv->event_lock, timeout) )
                {
-                       /* Drop the event after 3 seconds */
+                       /* Drop the event if the event queue is still not emptying */
                        g_mutex_unlock(&priv->event_lock);
                        return;
                }
@@ -58,7 +56,7 @@ event_throw(ChimaraGlk *glk, glui32 type, winid_t win, glui32 val1, glui32 val2)
 static void
 get_appropriate_event(event_t *event)
 {
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+       ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
 
        g_mutex_lock(&glk_data->event_lock);
 
@@ -154,7 +152,7 @@ glk_select(event_t *event)
                        flush_window_buffer(win);
        }
 
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+       ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
 
        get_appropriate_event(event);
 
@@ -236,8 +234,8 @@ glk_select_poll(event_t *event)
 {
        g_return_if_fail(event != NULL);
 
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
-       
+       ChimaraGlkPrivate *glk_data = g_private_get(&glk_data_key);
+
        event->type = evtype_None;
        event->win = NULL;
        event->val1 = 0;