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