summaryrefslogtreecommitdiff
path: root/source4/gtk/common/gtk_events.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/gtk/common/gtk_events.c')
-rw-r--r--source4/gtk/common/gtk_events.c45
1 files changed, 21 insertions, 24 deletions
diff --git a/source4/gtk/common/gtk_events.c b/source4/gtk/common/gtk_events.c
index fdc6d55621..df4ffc5cc8 100644
--- a/source4/gtk/common/gtk_events.c
+++ b/source4/gtk/common/gtk_events.c
@@ -209,46 +209,44 @@ static void gtk_event_set_fd_flags(struct fd_event *fde, uint16_t flags)
}
struct gtk_timed_event {
- BOOL running;
guint te_id;
};
-static gboolean gtk_event_timed_handler(gpointer data)
+/*
+ destroy a timed event
+*/
+static int gtk_event_timed_destructor(void *ptr)
{
- struct timed_event *te = talloc_get_type(data, struct timed_event);
+ struct timed_event *te = talloc_get_type(ptr, struct timed_event);
struct gtk_timed_event *gtk_te = talloc_get_type(te->additional_data,
struct gtk_timed_event);
- struct timeval t = timeval_current();
- gtk_te->running = True;
- te->handler(te->event_ctx, te, t, te->private_data);
- gtk_te->running = False;
+ g_source_remove(gtk_te->te_id);
- talloc_free(te);
+ return 0;
+}
- /* return FALSE mean this event should be removed */
- return gtk_false();
+static int gtk_event_timed_deny_destructor(void *ptr)
+{
+ return -1;
}
-/*
- destroy a timed event
-*/
-static int gtk_event_timed_destructor(void *ptr)
+static gboolean gtk_event_timed_handler(gpointer data)
{
- struct timed_event *te = talloc_get_type(ptr, struct timed_event);
+ struct timed_event *te = talloc_get_type(data, struct timed_event);
struct gtk_timed_event *gtk_te = talloc_get_type(te->additional_data,
struct gtk_timed_event);
+ struct timeval t = timeval_current();
- if (gtk_te->running) {
- /* the event is running reject the talloc_free()
- as it's done by the gtk_event_timed_handler()
- */
- return -1;
- }
+ /* deny the handler to free the event */
+ talloc_set_destructor(te, gtk_event_timed_deny_destructor);
+ te->handler(te->event_ctx, te, t, te->private_data);
- g_source_remove(gtk_te->te_id);
+ talloc_set_destructor(te, gtk_event_timed_destructor);
+ talloc_free(te);
- return 0;
+ /* return FALSE mean this event should be removed */
+ return gtk_false();
}
/*
@@ -285,7 +283,6 @@ static struct timed_event *gtk_event_add_timed(struct event_context *ev, TALLOC_
timeout = ((diff_tv.tv_usec+999)/1000)+(diff_tv.tv_sec*1000);
gtk_te->te_id = g_timeout_add(timeout, gtk_event_timed_handler, te);
- gtk_te->running = False;
talloc_set_destructor(te, gtk_event_timed_destructor);