[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Wed Oct 5 13:33:03 UTC 2016


The branch, master has been updated
       via  402c3c4 tevent: version 0.9.31
       via  d05dfe3 messaging: Add an indirection for messaging_dgm_register_tevent_context
       via  34292d0 messages_dgm: Avoid an unnecessary declaration
      from  23e77c5 messaging: Avoid crashes

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


- Log -----------------------------------------------------------------
commit 402c3c4062864df4a6da76df9ac1734c7bcbee8e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Oct 5 08:59:19 2016 +0200

    tevent: version 0.9.31
    
    * tevent_update_timer() and tevent_req_reset_endtime() have been added
    * documentation updates
    * it is now safe to talloc_free() a tevent_threaded_context,
      all running threads keep running until they're finished,
      but we no longer abort().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Volker Lendecke <vl at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Wed Oct  5 15:32:35 CEST 2016 on sn-devel-144

commit d05dfe38074f052a6de6f9145c63470608d16594
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Sep 30 21:53:44 2016 -0700

    messaging: Add an indirection for messaging_dgm_register_tevent_context
    
    Only one tevent_fd is possible for every file descriptor.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 34292d0b4b0cc203677fb3464510670aec32798c
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Sep 30 22:17:44 2016 -0700

    messages_dgm: Avoid an unnecessary declaration
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

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

Summary of changes:
 lib/tevent/ABI/tevent-0.9.30.sigs                  |   3 -
 .../ABI/{tevent-0.9.30.sigs => tevent-0.9.31.sigs} |   0
 lib/tevent/wscript                                 |   2 +-
 source3/lib/messages.c                             |   9 +-
 source3/lib/messages_dgm.c                         | 100 ++++++++++++++++++++-
 source3/lib/messages_dgm.h                         |   5 +-
 source3/lib/messages_dgm_ref.c                     |  17 ++--
 7 files changed, 113 insertions(+), 23 deletions(-)
 copy lib/tevent/ABI/{tevent-0.9.30.sigs => tevent-0.9.31.sigs} (100%)


Changeset truncated at 500 lines:

diff --git a/lib/tevent/ABI/tevent-0.9.30.sigs b/lib/tevent/ABI/tevent-0.9.30.sigs
index 7a6a236..9b8bfa1 100644
--- a/lib/tevent/ABI/tevent-0.9.30.sigs
+++ b/lib/tevent/ABI/tevent-0.9.30.sigs
@@ -36,7 +36,6 @@ tevent_common_loop_wait: int (struct tevent_context *, const char *)
 tevent_common_schedule_immediate: void (struct tevent_immediate *, struct tevent_context *, tevent_immediate_handler_t, void *, const char *, const char *)
 tevent_common_threaded_activate_immediate: void (struct tevent_context *)
 tevent_common_wakeup: int (struct tevent_context *)
-tevent_common_wakeup_fd: int (int)
 tevent_common_wakeup_init: int (struct tevent_context *)
 tevent_context_init: struct tevent_context *(TALLOC_CTX *)
 tevent_context_init_byname: struct tevent_context *(TALLOC_CTX *, const char *)
@@ -69,7 +68,6 @@ tevent_req_poll: bool (struct tevent_req *, struct tevent_context *)
 tevent_req_post: struct tevent_req *(struct tevent_req *, struct tevent_context *)
 tevent_req_print: char *(TALLOC_CTX *, struct tevent_req *)
 tevent_req_received: void (struct tevent_req *)
-tevent_req_reset_endtime: void (struct tevent_req *)
 tevent_req_set_callback: void (struct tevent_req *, tevent_req_fn, void *)
 tevent_req_set_cancel_fn: void (struct tevent_req *, tevent_req_cancel_fn)
 tevent_req_set_cleanup_fn: void (struct tevent_req *, tevent_req_cleanup_fn)
@@ -94,6 +92,5 @@ tevent_timeval_set: struct timeval (uint32_t, uint32_t)
 tevent_timeval_until: struct timeval (const struct timeval *, const struct timeval *)
 tevent_timeval_zero: struct timeval (void)
 tevent_trace_point_callback: void (struct tevent_context *, enum tevent_trace_point)
-tevent_update_timer: void (struct tevent_timer *, struct timeval)
 tevent_wakeup_recv: bool (struct tevent_req *)
 tevent_wakeup_send: struct tevent_req *(TALLOC_CTX *, struct tevent_context *, struct timeval)
diff --git a/lib/tevent/ABI/tevent-0.9.30.sigs b/lib/tevent/ABI/tevent-0.9.31.sigs
similarity index 100%
copy from lib/tevent/ABI/tevent-0.9.30.sigs
copy to lib/tevent/ABI/tevent-0.9.31.sigs
diff --git a/lib/tevent/wscript b/lib/tevent/wscript
index 380316d..580ca4d 100755
--- a/lib/tevent/wscript
+++ b/lib/tevent/wscript
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'tevent'
-VERSION = '0.9.30'
+VERSION = '0.9.31'
 
 blddir = 'bin'
 
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index fd128e9..08942a6 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -637,7 +637,7 @@ static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx,
 struct messaging_filtered_read_state {
 	struct tevent_context *ev;
 	struct messaging_context *msg_ctx;
-	void *tevent_handle;
+	struct messaging_dgm_fde *fde;
 
 	bool (*filter)(struct messaging_rec *rec, void *private_data);
 	void *private_data;
@@ -674,9 +674,8 @@ struct tevent_req *messaging_filtered_read_send(
 	 */
 	tevent_req_defer_callback(req, state->ev);
 
-	state->tevent_handle = messaging_dgm_register_tevent_context(
-		state, ev);
-	if (tevent_req_nomem(state->tevent_handle, req)) {
+	state->fde = messaging_dgm_register_tevent_context(state, ev);
+	if (tevent_req_nomem(state->fde, req)) {
 		return tevent_req_post(req, ev);
 	}
 
@@ -718,7 +717,7 @@ static void messaging_filtered_read_cleanup(struct tevent_req *req,
 
 	tevent_req_set_cleanup_fn(req, NULL);
 
-	TALLOC_FREE(state->tevent_handle);
+	TALLOC_FREE(state->fde);
 
 	/*
 	 * Just set the [new_]waiters entry to NULL, be careful not to mess
diff --git a/source3/lib/messages_dgm.c b/source3/lib/messages_dgm.c
index 7991d42..39b779b 100644
--- a/source3/lib/messages_dgm.c
+++ b/source3/lib/messages_dgm.c
@@ -41,7 +41,24 @@ struct sun_path_buf {
 	char buf[sizeof(struct sockaddr_un)];
 };
 
-struct messaging_dgm_context;
+/*
+ * We can only have one tevent_fd per dgm_context and per
+ * tevent_context. Maintain a list of registered tevent_contexts per
+ * dgm_context.
+ */
+struct messaging_dgm_fde_ev {
+	struct messaging_dgm_fde_ev *prev, *next;
+
+	/*
+	 * Backreference to enable DLIST_REMOVE from our
+	 * destructor. Also, set to NULL when the dgm_context dies
+	 * before the messaging_dgm_fde_ev.
+	 */
+	struct messaging_dgm_context *ctx;
+
+	struct tevent_context *ev;
+	struct tevent_fd *fde;
+};
 
 struct messaging_dgm_out {
 	struct messaging_dgm_out *prev, *next;
@@ -77,6 +94,7 @@ struct messaging_dgm_context {
 	int sock;
 	struct messaging_dgm_in_msg *in_msgs;
 
+	struct messaging_dgm_fde_ev *fde_evs;
 	void (*recv_cb)(struct tevent_context *ev,
 			const uint8_t *msg,
 			size_t msg_len,
@@ -938,6 +956,11 @@ static int messaging_dgm_context_destructor(struct messaging_dgm_context *c)
 	while (c->in_msgs != NULL) {
 		TALLOC_FREE(c->in_msgs);
 	}
+	while (c->fde_evs != NULL) {
+		tevent_fd_set_flags(c->fde_evs->fde, 0);
+		c->fde_evs->ctx = NULL;
+		DLIST_REMOVE(c->fde_evs, c->fde_evs);
+	}
 
 	close(c->sock);
 
@@ -1351,14 +1374,83 @@ int messaging_dgm_wipe(void)
 	return 0;
 }
 
-struct tevent_fd *messaging_dgm_register_tevent_context(
+struct messaging_dgm_fde {
+	struct tevent_fd *fde;
+};
+
+static int messaging_dgm_fde_ev_destructor(struct messaging_dgm_fde_ev *fde_ev)
+{
+	if (fde_ev->ctx != NULL) {
+		DLIST_REMOVE(fde_ev->ctx->fde_evs, fde_ev);
+		fde_ev->ctx = NULL;
+	}
+	return 0;
+}
+
+struct messaging_dgm_fde *messaging_dgm_register_tevent_context(
 	TALLOC_CTX *mem_ctx, struct tevent_context *ev)
 {
 	struct messaging_dgm_context *ctx = global_dgm_context;
+	struct messaging_dgm_fde_ev *fde_ev;
+	struct messaging_dgm_fde *fde;
 
 	if (ctx == NULL) {
 		return NULL;
 	}
-	return tevent_add_fd(ev, mem_ctx, ctx->sock, TEVENT_FD_READ,
-			     messaging_dgm_read_handler, ctx);
+
+	fde = talloc(mem_ctx, struct messaging_dgm_fde);
+	if (fde == NULL) {
+		return NULL;
+	}
+
+	for (fde_ev = ctx->fde_evs; fde_ev != NULL; fde_ev = fde_ev->next) {
+		if ((fde_ev->ev == ev) &&
+		    (tevent_fd_get_flags(fde_ev->fde) != 0)) {
+			break;
+		}
+	}
+
+	if (fde_ev == NULL) {
+		fde_ev = talloc(fde, struct messaging_dgm_fde_ev);
+		if (fde_ev == NULL) {
+			return NULL;
+		}
+		fde_ev->fde = tevent_add_fd(
+			ev, fde_ev, ctx->sock, TEVENT_FD_READ,
+			messaging_dgm_read_handler, ctx);
+		if (fde_ev->fde == NULL) {
+			TALLOC_FREE(fde);
+			return NULL;
+		}
+		fde_ev->ev = ev;
+		fde_ev->ctx = ctx;
+		DLIST_ADD(ctx->fde_evs, fde_ev);
+		talloc_set_destructor(
+			fde_ev, messaging_dgm_fde_ev_destructor);
+	} else {
+		/*
+		 * Same trick as with tdb_wrap: The caller will never
+		 * see the talloc_referenced object, the
+		 * messaging_dgm_fde_ev, so problems with
+		 * talloc_unlink will not happen.
+		 */
+		if (talloc_reference(fde, fde_ev) == NULL) {
+			TALLOC_FREE(fde);
+			return NULL;
+		}
+	}
+
+	fde->fde = fde_ev->fde;
+	return fde;
+}
+
+bool messaging_dgm_fde_active(struct messaging_dgm_fde *fde)
+{
+	uint16_t flags;
+
+	if (fde == NULL) {
+		return false;
+	}
+	flags = tevent_fd_get_flags(fde->fde);
+	return (flags != 0);
 }
diff --git a/source3/lib/messages_dgm.h b/source3/lib/messages_dgm.h
index 3d450a1..ca11db1 100644
--- a/source3/lib/messages_dgm.h
+++ b/source3/lib/messages_dgm.h
@@ -42,7 +42,10 @@ int messaging_dgm_send(pid_t pid,
 		       const int *fds, size_t num_fds);
 int messaging_dgm_cleanup(pid_t pid);
 int messaging_dgm_wipe(void);
-struct tevent_fd *messaging_dgm_register_tevent_context(
+
+struct messaging_dgm_fde;
+struct messaging_dgm_fde *messaging_dgm_register_tevent_context(
 	TALLOC_CTX *mem_ctx, struct tevent_context *ev);
+bool messaging_dgm_fde_active(struct messaging_dgm_fde *fde);
 
 #endif
diff --git a/source3/lib/messages_dgm_ref.c b/source3/lib/messages_dgm_ref.c
index bc6b69f..39d2270 100644
--- a/source3/lib/messages_dgm_ref.c
+++ b/source3/lib/messages_dgm_ref.c
@@ -26,7 +26,7 @@
 
 struct msg_dgm_ref {
 	struct msg_dgm_ref *prev, *next;
-	struct tevent_fd *tevent_handle;
+	struct messaging_dgm_fde *fde;
 	void (*recv_cb)(struct tevent_context *ev,
 			const uint8_t *msg, size_t msg_len,
 			int *fds, size_t num_fds, void *private_data);
@@ -59,7 +59,7 @@ void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 		*err = ENOMEM;
 		return NULL;
 	}
-	result->tevent_handle = NULL;
+	result->fde = NULL;
 
 	tmp_refs = refs;
 
@@ -98,9 +98,8 @@ void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
 
 	}
 
-	result->tevent_handle = messaging_dgm_register_tevent_context(
-		result, ev);
-	if (result->tevent_handle == NULL) {
+	result->fde = messaging_dgm_register_tevent_context(result, ev);
+	if (result->fde == NULL) {
 		TALLOC_FREE(result);
 		*err = ENOMEM;
 		return NULL;
@@ -129,12 +128,12 @@ static void msg_dgm_ref_recv(struct tevent_context *ev,
 	 * that grabs the fd's will get them.
 	 */
 	for (r = refs; r != NULL; r = next) {
-		uint16_t flags;
+		bool active;
 
 		next = r->next;
 
-		flags = tevent_fd_get_flags(r->tevent_handle);
-		if (flags == 0) {
+		active = messaging_dgm_fde_active(r->fde);
+		if (!active) {
 			/*
 			 * r's tevent_context has died.
 			 */
@@ -153,7 +152,7 @@ static int msg_dgm_ref_destructor(struct msg_dgm_ref *r)
 	}
 	DLIST_REMOVE(refs, r);
 
-	TALLOC_FREE(r->tevent_handle);
+	TALLOC_FREE(r->fde);
 
 	DBG_DEBUG("refs=%p\n", refs);
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list