00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <glib.h>
00021 #include <pthread.h>
00022 #include <string.h>
00023
00024 #include "core.h"
00025 #include "hook.h"
00026
00027 typedef struct {
00028 char * name;
00029 void * data;
00030 void (* destroy) (void *);
00031 int source;
00032 } Event;
00033
00034 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
00035 static GList * events;
00036
00037 static bool_t event_execute (Event * event)
00038 {
00039 pthread_mutex_lock (& mutex);
00040
00041 g_source_remove (event->source);
00042 events = g_list_remove (events, event);
00043
00044 pthread_mutex_unlock (& mutex);
00045
00046 hook_call (event->name, event->data);
00047
00048 g_free (event->name);
00049 if (event->destroy)
00050 event->destroy (event->data);
00051
00052 g_slice_free (Event, event);
00053 return FALSE;
00054 }
00055
00056 void event_queue_full (int time, const char * name, void * data, void (* destroy) (void *))
00057 {
00058 Event * event = g_slice_new (Event);
00059 event->name = g_strdup (name);
00060 event->data = data;
00061 event->destroy = destroy;
00062
00063 pthread_mutex_lock (& mutex);
00064
00065 event->source = g_timeout_add (time, (GSourceFunc) event_execute, event);
00066 events = g_list_prepend (events, event);
00067
00068 pthread_mutex_unlock (& mutex);
00069 }
00070
00071 void event_queue_cancel (const char * name, void * data)
00072 {
00073 pthread_mutex_lock (& mutex);
00074
00075 GList * node = events;
00076 while (node)
00077 {
00078 Event * event = node->data;
00079 GList * next = node->next;
00080
00081 if (! strcmp (event->name, name) && (! data || event->data == data))
00082 {
00083 g_source_remove (event->source);
00084 events = g_list_delete_link (events, node);
00085
00086 g_free (event->name);
00087 if (event->destroy)
00088 event->destroy (event->data);
00089
00090 g_slice_free (Event, event);
00091 }
00092
00093 node = next;
00094 }
00095
00096 pthread_mutex_unlock (& mutex);
00097 }