summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-02-24 20:52:07 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-02-24 20:52:07 +0000
commitd6c6e3c549fc59e25dd0869495e7b2f8c1ef999f (patch)
tree4f3b04232736492ea259535e2923c9bd92bcc563 /common
parent8d49d5f190c9e7ff03e2c8a596881fbbb59454aa (diff)
Add support for destroy notification function
Diffstat (limited to 'common')
-rw-r--r--common/glib-ectomy.c19
-rw-r--r--common/glib-ectomy.h7
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);