[SCM] Samba Shared Repository - branch master updated - 991b294c411dd846b07952a1f714c0728d87fa98

Stefan Metzmacher metze at samba.org
Mon Jan 5 21:45:27 GMT 2009


The branch, master has been updated
       via  991b294c411dd846b07952a1f714c0728d87fa98 (commit)
       via  e83a55c35643af2dad8e11bd51797908a6224451 (commit)
       via  b09718fef22ba6805482e85fd0b0e339f19d2324 (commit)
       via  e240ca5bdd7e344ecce127997b67ca0a521e3ed8 (commit)
       via  ceac26008c6f36602259d0180f1e7f7a756ea4ad (commit)
       via  b24924d6a6438b361fb903227bd56d2afe40d2f2 (commit)
       via  a99f76960d9f326663d26d15aa0bf57f6ea3927f (commit)
      from  6572eff1835036ceed805b33fb1bb53c8404b7b7 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 991b294c411dd846b07952a1f714c0728d87fa98
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 19:47:59 2009 +0100

    s3:events: use more tevent_common_* functions
    
    metze

commit e83a55c35643af2dad8e11bd51797908a6224451
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 19:52:47 2009 +0100

    tevent: add some debugging for timer events, that mostly matches samba3
    
    metze

commit b09718fef22ba6805482e85fd0b0e339f19d2324
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 19:23:23 2009 +0100

    tevent: add tevent_context destructor that unlinks the events from the context
    
    metze

commit e240ca5bdd7e344ecce127997b67ca0a521e3ed8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 19:22:22 2009 +0100

    tevent: don't crash if te->event_ctx is NULL
    
    metze

commit ceac26008c6f36602259d0180f1e7f7a756ea4ad
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 17:36:50 2009 +0100

    tevent: keep a linked list of fd_events
    
    metze

commit b24924d6a6438b361fb903227bd56d2afe40d2f2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 16:55:00 2009 +0100

    tevent: keep a linked list of signal events
    
    metze

commit a99f76960d9f326663d26d15aa0bf57f6ea3927f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 5 19:41:03 2009 +0100

    tevent: make tevent_debug() a noop if ev is NULL
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 lib/tevent/tevent.c          |   31 ++++++++
 lib/tevent/tevent_aio.c      |   52 ++++----------
 lib/tevent/tevent_debug.c    |    3 +
 lib/tevent/tevent_epoll.c    |   51 ++++---------
 lib/tevent/tevent_fd.c       |   43 +++++++++++
 lib/tevent/tevent_internal.h |   20 +++++-
 lib/tevent/tevent_select.c   |   59 +++++-----------
 lib/tevent/tevent_signal.c   |   52 +++++++++++--
 lib/tevent/tevent_standard.c |   61 ++++++----------
 lib/tevent/tevent_timed.c    |   18 ++++-
 source3/lib/events.c         |  164 ++----------------------------------------
 11 files changed, 230 insertions(+), 324 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tevent/tevent.c b/lib/tevent/tevent.c
index 5582b58..2e5abbf 100644
--- a/lib/tevent/tevent.c
+++ b/lib/tevent/tevent.c
@@ -136,6 +136,35 @@ const char **tevent_backend_list(TALLOC_CTX *mem_ctx)
 	return list;
 }
 
+int tevent_common_context_destructor(struct tevent_context *ev)
+{
+	struct tevent_fd *fd;
+	struct tevent_timer *te;
+	struct tevent_signal *se;
+
+	if (ev->pipe_fde) {
+		talloc_free(ev->pipe_fde);
+		ev->pipe_fde = NULL;
+	}
+
+	for (fd=ev->fd_events; fd; fd = fd->next) {
+		fd->event_ctx = NULL;
+		DLIST_REMOVE(ev->fd_events, fd);
+	}
+
+	for (te=ev->timer_events; te; te = te->next) {
+		te->event_ctx = NULL;
+		DLIST_REMOVE(ev->timer_events, te);
+	}
+
+	for (se=ev->signal_events; se; se = se->next) {
+		se->event_ctx = NULL;
+		DLIST_REMOVE(ev->signal_events, se);
+	}
+
+	return 0;
+}
+
 /*
   create a event_context structure for a specific implemementation.
   This must be the first events call, and all subsequent calls pass
@@ -156,6 +185,8 @@ static struct tevent_context *tevent_context_init_ops(TALLOC_CTX *mem_ctx,
 	ev = talloc_zero(mem_ctx, struct tevent_context);
 	if (!ev) return NULL;
 
+	talloc_set_destructor(ev, tevent_common_context_destructor);
+
 	ev->ops = ops;
 
 	ret = ev->ops->context_init(ev);
diff --git a/lib/tevent/tevent_aio.c b/lib/tevent/tevent_aio.c
index b15dab3..330794f 100644
--- a/lib/tevent/tevent_aio.c
+++ b/lib/tevent/tevent_aio.c
@@ -47,12 +47,6 @@ struct aio_event_context {
 	/* a pointer back to the generic event_context */
 	struct tevent_context *ev;
 
-	/* list of filedescriptor events */
-	struct tevent_fd *fd_events;
-
-	/* number of registered fd event handlers */
-	int num_fd_events;
-
 	uint32_t destruction_count;
 
 	io_context_t ioctx;
@@ -118,7 +112,7 @@ static void epoll_check_reopen(struct aio_event_context *aio_ev)
 		return;
 	}
 	aio_ev->pid = getpid();
-	for (fde=aio_ev->fd_events;fde;fde=fde->next) {
+	for (fde=aio_ev->ev->fd_events;fde;fde=fde->next) {
 		epoll_add_event(aio_ev, fde);
 	}
 }
@@ -159,8 +153,6 @@ static void epoll_del_event(struct aio_event_context *aio_ev, struct tevent_fd *
 {
 	struct epoll_event event;
 
-	DLIST_REMOVE(aio_ev->fd_events, fde);
-
 	if (aio_ev->epoll_fd == -1) return;
 
 	fde->additional_flags &= ~EPOLL_ADDITIONAL_FD_FLAG_REPORT_ERROR;
@@ -219,7 +211,6 @@ static void epoll_change_event(struct aio_event_context *aio_ev, struct tevent_f
 
 	/* there's no aio_event attached to the fde */
 	if (want_read || (want_write && !got_error)) {
-		DLIST_ADD(aio_ev->fd_events, fde);
 		epoll_add_event(aio_ev, fde);
 		return;
 	}
@@ -260,7 +251,7 @@ static int aio_event_loop(struct aio_event_context *aio_ev, struct timeval *tval
 
 	if (aio_ev->epoll_fd == -1) return -1;
 
-	if (aio_ev->ev->num_signal_handlers && 
+	if (aio_ev->ev->signal_events &&
 	    tevent_common_check_signal(aio_ev->ev)) {
 		return 0;
 	}
@@ -278,7 +269,7 @@ static int aio_event_loop(struct aio_event_context *aio_ev, struct timeval *tval
 			   events, tvalp?&timeout:NULL);
 
 	if (ret == -EINTR) {
-		if (aio_ev->ev->num_signal_handlers) {
+		if (aio_ev->ev->signal_events) {
 			tevent_common_check_signal(aio_ev->ev);
 		}
 		return 0;
@@ -389,22 +380,20 @@ static int aio_event_context_init(struct tevent_context *ev)
 static int aio_event_fd_destructor(struct tevent_fd *fde)
 {
 	struct tevent_context *ev = fde->event_ctx;
-	struct aio_event_context *aio_ev = talloc_get_type(ev->additional_data,
-							   struct aio_event_context);
+	struct aio_event_context *aio_ev = NULL;
 
-	epoll_check_reopen(aio_ev);
+	if (ev) {
+		aio_ev = talloc_get_type(ev->additional_data,
+					 struct aio_event_context);
 
-	aio_ev->num_fd_events--;
-	aio_ev->destruction_count++;
+		epoll_check_reopen(aio_ev);
 
-	epoll_del_event(aio_ev, fde);
+		aio_ev->destruction_count++;
 
-	if (fde->close_fn) {
-		fde->close_fn(ev, fde, fde->fd, fde->private_data);
-		fde->fd = -1;
+		epoll_del_event(aio_ev, fde);
 	}
 
-	return 0;
+	return tevent_common_fd_destructor(fde);
 }
 
 /*
@@ -424,24 +413,13 @@ static struct tevent_fd *aio_event_add_fd(struct tevent_context *ev, TALLOC_CTX
 
 	epoll_check_reopen(aio_ev);
 
-	fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
+	fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
+				   handler, private_data,
+				   handler_name, location);
 	if (!fde) return NULL;
 
-	fde->event_ctx		= ev;
-	fde->fd			= fd;
-	fde->flags		= flags;
-	fde->handler		= handler;
-	fde->close_fn		= NULL;
-	fde->private_data	= private_data;
-	fde->handler_name	= handler_name;
-	fde->location		= location;
-	fde->additional_flags	= 0;
-	fde->additional_data	= NULL;
-
-	aio_ev->num_fd_events++;
 	talloc_set_destructor(fde, aio_event_fd_destructor);
 
-	DLIST_ADD(aio_ev->fd_events, fde);
 	epoll_add_event(aio_ev, fde);
 
 	return fde;
@@ -493,7 +471,7 @@ static int aio_event_loop_wait(struct tevent_context *ev)
 {
 	struct aio_event_context *aio_ev = talloc_get_type(ev->additional_data,
 							   struct aio_event_context);
-	while (aio_ev->num_fd_events) {
+	while (aio_ev->ev->fd_events) {
 		if (aio_event_loop_once(ev) != 0) {
 			break;
 		}
diff --git a/lib/tevent/tevent_debug.c b/lib/tevent/tevent_debug.c
index 841446b..ad5212b 100644
--- a/lib/tevent/tevent_debug.c
+++ b/lib/tevent/tevent_debug.c
@@ -79,6 +79,9 @@ void tevent_debug(struct tevent_context *ev, enum tevent_debug_level level,
 		  const char *fmt, ...)
 {
 	va_list ap;
+	if (!ev) {
+		return;
+	}
 	if (ev->debug_ops.debug == NULL) {
 		return;
 	}
diff --git a/lib/tevent/tevent_epoll.c b/lib/tevent/tevent_epoll.c
index 3835774..b90e4c7 100644
--- a/lib/tevent/tevent_epoll.c
+++ b/lib/tevent/tevent_epoll.c
@@ -31,12 +31,6 @@ struct epoll_event_context {
 	/* a pointer back to the generic event_context */
 	struct tevent_context *ev;
 
-	/* list of filedescriptor events */
-	struct tevent_fd *fd_events;
-
-	/* number of registered fd event handlers */
-	int num_fd_events;
-
 	/* this is changed by the destructors for the fd event
 	   type. It is used to detect event destruction by event
 	   handlers, which means the code that is calling the event
@@ -120,7 +114,7 @@ static void epoll_check_reopen(struct epoll_event_context *epoll_ev)
 		return;
 	}
 	epoll_ev->pid = getpid();
-	for (fde=epoll_ev->fd_events;fde;fde=fde->next) {
+	for (fde=epoll_ev->ev->fd_events;fde;fde=fde->next) {
 		epoll_add_event(epoll_ev, fde);
 	}
 }
@@ -256,14 +250,14 @@ static int epoll_event_loop(struct epoll_event_context *epoll_ev, struct timeval
 		timeout = ((tvalp->tv_usec+999) / 1000) + (tvalp->tv_sec*1000);
 	}
 
-	if (epoll_ev->ev->num_signal_handlers && 
+	if (epoll_ev->ev->signal_events &&
 	    tevent_common_check_signal(epoll_ev->ev)) {
 		return 0;
 	}
 
 	ret = epoll_wait(epoll_ev->epoll_fd, events, MAXEVENTS, timeout);
 
-	if (ret == -1 && errno == EINTR && epoll_ev->ev->num_signal_handlers) {
+	if (ret == -1 && errno == EINTR && epoll_ev->ev->signal_events) {
 		if (tevent_common_check_signal(epoll_ev->ev)) {
 			return 0;
 		}
@@ -345,24 +339,20 @@ static int epoll_event_context_init(struct tevent_context *ev)
 static int epoll_event_fd_destructor(struct tevent_fd *fde)
 {
 	struct tevent_context *ev = fde->event_ctx;
-	struct epoll_event_context *epoll_ev = talloc_get_type(ev->additional_data,
-							   struct epoll_event_context);
+	struct epoll_event_context *epoll_ev = NULL;
 
-	epoll_check_reopen(epoll_ev);
+	if (ev) {
+		epoll_ev = talloc_get_type(ev->additional_data,
+					   struct epoll_event_context);
 
-	epoll_ev->num_fd_events--;
-	epoll_ev->destruction_count++;
+		epoll_check_reopen(epoll_ev);
 
-	DLIST_REMOVE(epoll_ev->fd_events, fde);
-		
-	epoll_del_event(epoll_ev, fde);
+		epoll_ev->destruction_count++;
 
-	if (fde->close_fn) {
-		fde->close_fn(ev, fde, fde->fd, fde->private_data);
-		fde->fd = -1;
+		epoll_del_event(epoll_ev, fde);
 	}
 
-	return 0;
+	return tevent_common_fd_destructor(fde);
 }
 
 /*
@@ -382,24 +372,13 @@ static struct tevent_fd *epoll_event_add_fd(struct tevent_context *ev, TALLOC_CT
 
 	epoll_check_reopen(epoll_ev);
 
-	fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
+	fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
+				   handler, private_data,
+				   handler_name, location);
 	if (!fde) return NULL;
 
-	fde->event_ctx		= ev;
-	fde->fd			= fd;
-	fde->flags		= flags;
-	fde->handler		= handler;
-	fde->close_fn		= NULL;
-	fde->private_data	= private_data;
-	fde->handler_name	= handler_name;
-	fde->location		= location;
-	fde->additional_flags	= 0;
-	fde->additional_data	= NULL;
-
-	epoll_ev->num_fd_events++;
 	talloc_set_destructor(fde, epoll_event_fd_destructor);
 
-	DLIST_ADD(epoll_ev->fd_events, fde);
 	epoll_add_event(epoll_ev, fde);
 
 	return fde;
@@ -451,7 +430,7 @@ static int epoll_event_loop_wait(struct tevent_context *ev)
 {
 	struct epoll_event_context *epoll_ev = talloc_get_type(ev->additional_data,
 							   struct epoll_event_context);
-	while (epoll_ev->num_fd_events) {
+	while (epoll_ev->ev->fd_events) {
 		if (epoll_event_loop_once(ev) != 0) {
 			break;
 		}
diff --git a/lib/tevent/tevent_fd.c b/lib/tevent/tevent_fd.c
index d450e21..acba2c7 100644
--- a/lib/tevent/tevent_fd.c
+++ b/lib/tevent/tevent_fd.c
@@ -24,6 +24,49 @@
 #include "tevent_internal.h"
 #include "tevent_util.h"
 
+int tevent_common_fd_destructor(struct tevent_fd *fde)
+{
+	if (fde->event_ctx) {
+		DLIST_REMOVE(fde->event_ctx->fd_events, fde);
+	}
+
+	if (fde->close_fn) {
+		fde->close_fn(fde->event_ctx, fde, fde->fd, fde->private_data);
+		fde->fd = -1;
+	}
+
+	return 0;
+}
+
+struct tevent_fd *tevent_common_add_fd(struct tevent_context *ev, TALLOC_CTX *mem_ctx,
+				       int fd, uint16_t flags,
+				       tevent_fd_handler_t handler,
+				       void *private_data,
+				       const char *handler_name,
+				       const char *location)
+{
+	struct tevent_fd *fde;
+
+	fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
+	if (!fde) return NULL;
+
+	fde->event_ctx		= ev;
+	fde->fd			= fd;
+	fde->flags		= flags;
+	fde->handler		= handler;
+	fde->close_fn		= NULL;
+	fde->private_data	= private_data;
+	fde->handler_name	= handler_name;
+	fde->location		= location;
+	fde->additional_flags	= 0;
+	fde->additional_data	= NULL;
+
+	DLIST_ADD(ev->fd_events, fde);
+
+	talloc_set_destructor(fde, tevent_common_fd_destructor);
+
+	return fde;
+}
 uint16_t tevent_common_fd_get_flags(struct tevent_fd *fde)
 {
 	return fde->flags;
diff --git a/lib/tevent/tevent_internal.h b/lib/tevent/tevent_internal.h
index f29e9c6..32be12c 100644
--- a/lib/tevent/tevent_internal.h
+++ b/lib/tevent/tevent_internal.h
@@ -130,15 +130,18 @@ struct tevent_context {
 	/* the specific events implementation */
 	const struct tevent_ops *ops;
 
+	/* list of fd events - used by common code */
+	struct tevent_fd *fd_events;
+
 	/* list of timed events - used by common code */
 	struct tevent_timer *timer_events;
 
+	/* list of signal events - used by common code */
+	struct tevent_signal *signal_events;
+
 	/* this is private for the events_ops implementation */
 	void *additional_data;
 
-	/* number of signal event handlers */
-	int num_signal_handlers;
-
 	/* pipe hack used with signal handlers */
 	struct tevent_fd *pipe_fde;
 
@@ -149,6 +152,17 @@ struct tevent_context {
 
 bool tevent_register_backend(const char *name, const struct tevent_ops *ops);
 
+int tevent_common_context_destructor(struct tevent_context *ev);
+
+int tevent_common_fd_destructor(struct tevent_fd *fde);
+struct tevent_fd *tevent_common_add_fd(struct tevent_context *ev,
+				       TALLOC_CTX *mem_ctx,
+				       int fd,
+				       uint16_t flags,
+				       tevent_fd_handler_t handler,
+				       void *private_data,
+				       const char *handler_name,
+				       const char *location);
 void tevent_common_fd_set_close_fn(struct tevent_fd *fde,
 				   tevent_fd_close_fn_t close_fn);
 uint16_t tevent_common_fd_get_flags(struct tevent_fd *fde);
diff --git a/lib/tevent/tevent_select.c b/lib/tevent/tevent_select.c
index cf4453f..64f2dd2 100644
--- a/lib/tevent/tevent_select.c
+++ b/lib/tevent/tevent_select.c
@@ -18,11 +18,6 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-/*
-  This is SAMBA's default event loop code
-
-*/
-
 #include "replace.h"
 #include "system/filesys.h"
 #include "system/select.h"
@@ -34,12 +29,6 @@ struct select_event_context {
 	/* a pointer back to the generic event_context */
 	struct tevent_context *ev;
 
-	/* list of filedescriptor events */
-	struct tevent_fd *fd_events;
-
-	/* list of timed events */
-	struct tevent_timer *timed_events;
-
 	/* the maximum file descriptor number in fd_events */
 	int maxfd;
 
@@ -74,7 +63,7 @@ static void calc_maxfd(struct select_event_context *select_ev)
 	struct tevent_fd *fde;
 
 	select_ev->maxfd = 0;
-	for (fde = select_ev->fd_events; fde; fde = fde->next) {
+	for (fde = select_ev->ev->fd_events; fde; fde = fde->next) {
 		if (fde->fd > select_ev->maxfd) {
 			select_ev->maxfd = fde->fd;
 		}
@@ -93,22 +82,20 @@ static void calc_maxfd(struct select_event_context *select_ev)
 static int select_event_fd_destructor(struct tevent_fd *fde)
 {
 	struct tevent_context *ev = fde->event_ctx;
-	struct select_event_context *select_ev = talloc_get_type(ev->additional_data,
-							   struct select_event_context);
+	struct select_event_context *select_ev = NULL;
 
-	if (select_ev->maxfd == fde->fd) {
-		select_ev->maxfd = EVENT_INVALID_MAXFD;
-	}
+	if (ev) {
+		select_ev = talloc_get_type(ev->additional_data,
+					    struct select_event_context);
 
-	DLIST_REMOVE(select_ev->fd_events, fde);
-	select_ev->destruction_count++;
+		if (select_ev->maxfd == fde->fd) {
+			select_ev->maxfd = EVENT_INVALID_MAXFD;
+		}
 
-	if (fde->close_fn) {
-		fde->close_fn(ev, fde, fde->fd, fde->private_data);
-		fde->fd = -1;
+		select_ev->destruction_count++;
 	}
 
-	return 0;
+	return tevent_common_fd_destructor(fde);
 }
 
 /*
@@ -126,21 +113,11 @@ static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_C
 							   struct select_event_context);
 	struct tevent_fd *fde;
 
-	fde = talloc(mem_ctx?mem_ctx:ev, struct tevent_fd);
+	fde = tevent_common_add_fd(ev, mem_ctx, fd, flags,
+				   handler, private_data,
+				   handler_name, location);
 	if (!fde) return NULL;
 
-	fde->event_ctx		= ev;
-	fde->fd			= fd;
-	fde->flags		= flags;
-	fde->handler		= handler;
-	fde->close_fn		= NULL;
-	fde->private_data	= private_data;
-	fde->handler_name	= handler_name;
-	fde->location		= location;
-	fde->additional_flags	= 0;
-	fde->additional_data	= NULL;
-
-	DLIST_ADD(select_ev->fd_events, fde);
 	if (fde->fd > select_ev->maxfd) {
 		select_ev->maxfd = fde->fd;
 	}
@@ -168,7 +145,7 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
 	FD_ZERO(&w_fds);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list