From 38e43be7b89673282f8853ffedf726d84ef5ce30 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 27 Sep 2005 12:54:08 +0000 Subject: r10537: - we now use a much nicer way to handle talloc_free(timed_event) the events code replaces a destructor to one that returns allways -1 while it's calling the event handler - we don't need the composite and winsrepl specific fixes any more - this also fixes the problem with smbcli, dcerpc, cldap, ldap and nbt request timeouts metze (This used to be commit 495996cfc49a1c6eefde6ff04fc75e0739be3aab) --- source4/gtk/common/gtk_events.c | 45 +++++++++++++++++------------------- source4/lib/events/events_liboop.c | 13 ++++++++++- source4/lib/events/events_standard.c | 18 +++++++-------- source4/libcli/composite/composite.c | 6 ----- source4/libcli/wrepl/winsrepl.c | 6 ----- 5 files changed, 42 insertions(+), 46 deletions(-) (limited to 'source4') 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); diff --git a/source4/lib/events/events_liboop.c b/source4/lib/events/events_liboop.c index ad7c43cd4e..54cb8d5a52 100644 --- a/source4/lib/events/events_liboop.c +++ b/source4/lib/events/events_liboop.c @@ -172,12 +172,23 @@ static void oop_event_set_fd_flags(struct fd_event *fde, uint16_t flags) fde->flags = flags; } +static int oop_event_timed_destructor(void *ptr); +static int oop_event_timed_deny_destructor(void *ptr) +{ + return -1; +} + static void *oop_event_timed_handler(oop_source *oop, struct timeval t, void *ptr) { struct timed_event *te = ptr; + /* deny the handler to free the event */ + talloc_set_destructor(te, oop_event_timed_deny_destructor); te->handler(te->event_ctx, te, t, te->private_data); + talloc_set_destructor(te, oop_event_timed_destructor); + talloc_free(te); + return OOP_CONTINUE; } @@ -218,7 +229,7 @@ static struct timed_event *oop_event_add_timed(struct event_context *ev, TALLOC_ te->private_data = private_data; te->additional_data = NULL; - oop->cancel_time(oop, te->next_event, oop_event_timed_handler, te); + oop->on_time(oop, te->next_event, oop_event_timed_handler, te); talloc_set_destructor(te, oop_event_timed_destructor); diff --git a/source4/lib/events/events_standard.c b/source4/lib/events/events_standard.c index 810e8bbca3..8fe8d009bf 100644 --- a/source4/lib/events/events_standard.c +++ b/source4/lib/events/events_standard.c @@ -284,6 +284,11 @@ static int std_event_timed_destructor(void *ptr) return 0; } +static int std_event_timed_deny_destructor(void *ptr) +{ + return -1; +} + /* add a timed event return NULL on failure (memory allocation error) @@ -340,17 +345,12 @@ static void std_event_loop_timer(struct event_context *ev) return; } - te->next_event = timeval_zero(); - + /* deny the handler to free the event */ + talloc_set_destructor(te, std_event_timed_deny_destructor); te->handler(ev, te, t, te->private_data); - /* note the care taken to prevent referencing a event - that could have been freed by the handler */ - if (std_ev->timed_events) { - if (timeval_is_zero(&std_ev->timed_events->next_event)) { - talloc_free(te); - } - } + talloc_set_destructor(te, std_event_timed_destructor); + talloc_free(te); } #if WITH_EPOLL diff --git a/source4/libcli/composite/composite.c b/source4/libcli/composite/composite.c index f6fc61d764..4a5247c9ea 100644 --- a/source4/libcli/composite/composite.c +++ b/source4/libcli/composite/composite.c @@ -52,12 +52,6 @@ static void composite_trigger(struct event_context *ev, struct timed_event *te, { struct composite_context *c = talloc_get_type(ptr, struct composite_context); if (c->async.fn) { - /* - * the event is a child of req, - * and req will be free'ed by the callback fn - * but the events code wants to free the event itself - */ - talloc_steal(ev, te); c->async.fn(c); } } diff --git a/source4/libcli/wrepl/winsrepl.c b/source4/libcli/wrepl/winsrepl.c index 945f4a4b4c..853ee01d38 100644 --- a/source4/libcli/wrepl/winsrepl.c +++ b/source4/libcli/wrepl/winsrepl.c @@ -385,12 +385,6 @@ static void wrepl_request_trigger_handler(struct event_context *ev, struct timed { struct wrepl_request *req = talloc_get_type(ptr, struct wrepl_request); if (req->async.fn) { - /* - * the event is a child of req, - * and req will be free'ed by the callback fn - * but the events code wants to free the event itself - */ - talloc_steal(ev, te); req->async.fn(req); } } -- cgit