diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2006-02-24 20:52:07 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2006-02-24 20:52:07 +0000 |
commit | d6c6e3c549fc59e25dd0869495e7b2f8c1ef999f (patch) | |
tree | 4f3b04232736492ea259535e2923c9bd92bcc563 /common | |
parent | 8d49d5f190c9e7ff03e2c8a596881fbbb59454aa (diff) |
Add support for destroy notification function
Diffstat (limited to 'common')
-rw-r--r-- | common/glib-ectomy.c | 19 | ||||
-rw-r--r-- | common/glib-ectomy.h | 7 |
2 files changed, 23 insertions, 3 deletions
diff --git a/common/glib-ectomy.c b/common/glib-ectomy.c index 7c1f9d9f..c8e9bd44 100644 --- a/common/glib-ectomy.c +++ b/common/glib-ectomy.c @@ -79,9 +79,11 @@ gint g_io_channel_unix_get_fd(GIOChannel *channel) struct watch { guint id; GIOChannel *channel; + gint priority; GIOCondition condition; GIOFunc func; gpointer user_data; + GDestroyNotify destroy; struct watch *next; }; @@ -100,15 +102,19 @@ void g_io_remove_watch(guint id) } } -guint g_io_add_watch(GIOChannel *channel, GIOCondition condition, GIOFunc func, gpointer user_data) +guint g_io_add_watch_full(GIOChannel *channel, gint priority, + GIOCondition condition, GIOFunc func, + gpointer user_data, GDestroyNotify notify) { struct watch *watch = malloc(sizeof(struct watch)); watch->id = ++watch_head.id; watch->channel = channel; + watch->priority = priority; watch->condition = condition; watch->func = func; watch->user_data = user_data; + watch->destroy = notify; watch->next = watch_head.next; watch_head.next = watch; @@ -116,6 +122,13 @@ guint g_io_add_watch(GIOChannel *channel, GIOCondition condition, GIOFunc func, return watch->id; } +guint g_io_add_watch(GIOChannel *channel, GIOCondition condition, + GIOFunc func, gpointer user_data) +{ + return g_io_add_watch_full(channel, 0, condition, + func, user_data, NULL); +} + GMainLoop *g_main_loop_new(GMainContext *context, gboolean is_running) { GMainLoop *ml; @@ -162,6 +175,8 @@ void g_main_loop_run(GMainLoop *loop) if (ufds[i].revents) { gboolean keep = w->func(w->channel, ufds[i].revents, w->user_data); if (!keep) { + if (w->destroy) + w->destroy(w->user_data); p->next = w->next; memset(w, 0, sizeof(*w)); w = p->next; @@ -187,6 +202,6 @@ void g_main_loop_quit(GMainLoop *loop) for (w = watch_head.next; w; w = w->next) { watch_head.next = w->next; - free (w); + free(w); } } diff --git a/common/glib-ectomy.h b/common/glib-ectomy.h index c507e3c7..e921b40d 100644 --- a/common/glib-ectomy.h +++ b/common/glib-ectomy.h @@ -71,6 +71,7 @@ typedef enum { G_IO_NVAL = POLLNVAL } GIOCondition; +typedef void (*GDestroyNotify) (gpointer data); typedef gboolean (*GIOFunc) (GIOChannel *source, GIOCondition condition, gpointer data); GIOError g_io_channel_read(GIOChannel *channel, gchar *buf, gsize count, gsize *bytes_read); @@ -78,7 +79,11 @@ void g_io_channel_close(GIOChannel *channel); GIOChannel *g_io_channel_unix_new(int fd); gint g_io_channel_unix_get_fd(GIOChannel *channel); -guint g_io_add_watch(GIOChannel *channel, GIOCondition condition, GIOFunc func, gpointer user_data); +guint g_io_add_watch(GIOChannel *channel, GIOCondition condition, + GIOFunc func, gpointer user_data); +guint g_io_add_watch_full(GIOChannel *channel, gint priority, + GIOCondition condition, GIOFunc func, + gpointer user_data, GDestroyNotify notify); void g_io_remove_watch(guint id); GMainLoop *g_main_loop_new(GMainContext *context, gboolean is_running); |