svn commit: samba r10537 - in branches/SAMBA_4_0/source: gtk/common lib/events libcli/composite libcli/wrepl

metze at samba.org metze at samba.org
Tue Sep 27 12:54:09 GMT 2005


Author: metze
Date: 2005-09-27 12:54:08 +0000 (Tue, 27 Sep 2005)
New Revision: 10537

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10537

Log:
- 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
Modified:
   branches/SAMBA_4_0/source/gtk/common/gtk_events.c
   branches/SAMBA_4_0/source/lib/events/events_liboop.c
   branches/SAMBA_4_0/source/lib/events/events_standard.c
   branches/SAMBA_4_0/source/libcli/composite/composite.c
   branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c


Changeset:
Modified: branches/SAMBA_4_0/source/gtk/common/gtk_events.c
===================================================================
--- branches/SAMBA_4_0/source/gtk/common/gtk_events.c	2005-09-27 12:07:01 UTC (rev 10536)
+++ branches/SAMBA_4_0/source/gtk/common/gtk_events.c	2005-09-27 12:54:08 UTC (rev 10537)
@@ -209,46 +209,44 @@
 }
 
 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 @@
 	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);
 

Modified: branches/SAMBA_4_0/source/lib/events/events_liboop.c
===================================================================
--- branches/SAMBA_4_0/source/lib/events/events_liboop.c	2005-09-27 12:07:01 UTC (rev 10536)
+++ branches/SAMBA_4_0/source/lib/events/events_liboop.c	2005-09-27 12:54:08 UTC (rev 10537)
@@ -172,12 +172,23 @@
 	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 @@
 	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);
 

Modified: branches/SAMBA_4_0/source/lib/events/events_standard.c
===================================================================
--- branches/SAMBA_4_0/source/lib/events/events_standard.c	2005-09-27 12:07:01 UTC (rev 10536)
+++ branches/SAMBA_4_0/source/lib/events/events_standard.c	2005-09-27 12:54:08 UTC (rev 10537)
@@ -284,6 +284,11 @@
 	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 @@
 		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

Modified: branches/SAMBA_4_0/source/libcli/composite/composite.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/composite/composite.c	2005-09-27 12:07:01 UTC (rev 10536)
+++ branches/SAMBA_4_0/source/libcli/composite/composite.c	2005-09-27 12:54:08 UTC (rev 10537)
@@ -52,12 +52,6 @@
 {
 	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);
 	}
 }

Modified: branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c	2005-09-27 12:07:01 UTC (rev 10536)
+++ branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c	2005-09-27 12:54:08 UTC (rev 10537)
@@ -385,12 +385,6 @@
 {
 	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);
 	}
 }



More information about the samba-cvs mailing list