summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2015-05-18 13:15:35 +0200
committerVolker Lendecke <vl@samba.org>2015-05-28 11:13:09 +0200
commitcc51e85f0aa49aad529eca5711fdc34f95bfe6d8 (patch)
treeb16b652def7e704116a319a86f2ee5633027915a /source3/lib
parent586a95948029ce0491f05dfba67c986085adbb55 (diff)
downloadsamba-cc51e85f0aa49aad529eca5711fdc34f95bfe6d8.tar.gz
messaging: Register a tevent context for secondary dgm refs
When a secondary messaging context is initialized, we need to register its tevent context with the lower level dgm context. Seen when using smbstatus with clustering. The TALLOC_FREE(r->tevent_handle) in the destructor might not be necessary, but I want to free the tevent reference before the context goes away. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/messages_dgm_ref.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/source3/lib/messages_dgm_ref.c b/source3/lib/messages_dgm_ref.c
index 32b9c985296..b4511e00603 100644
--- a/source3/lib/messages_dgm_ref.c
+++ b/source3/lib/messages_dgm_ref.c
@@ -26,6 +26,7 @@
struct msg_dgm_ref {
struct msg_dgm_ref *prev, *next;
+ void *tevent_handle;
void (*recv_cb)(const uint8_t *msg, size_t msg_len,
int *fds, size_t num_fds, void *private_data);
void *recv_cb_private_data;
@@ -55,6 +56,7 @@ void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
*err = ENOMEM;
return NULL;
}
+ result->tevent_handle = NULL;
tmp_refs = refs;
@@ -79,6 +81,14 @@ void *messaging_dgm_ref(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
return NULL;
}
dgm_pid = getpid();
+ } else {
+ result->tevent_handle = messaging_dgm_register_tevent_context(
+ result, ev);
+ if (result->tevent_handle == NULL) {
+ TALLOC_FREE(result);
+ *err = ENOMEM;
+ return NULL;
+ }
}
refs = tmp_refs;
@@ -114,6 +124,8 @@ static int msg_dgm_ref_destructor(struct msg_dgm_ref *r)
}
DLIST_REMOVE(refs, r);
+ TALLOC_FREE(r->tevent_handle);
+
if (refs == NULL) {
messaging_dgm_destroy();
}