summaryrefslogtreecommitdiffstats
path: root/ctdb/common/ctdb_message.c
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb/common/ctdb_message.c')
-rw-r--r--ctdb/common/ctdb_message.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/ctdb/common/ctdb_message.c b/ctdb/common/ctdb_message.c
index ec39525942d..27c5c64bc0e 100644
--- a/ctdb/common/ctdb_message.c
+++ b/ctdb/common/ctdb_message.c
@@ -81,13 +81,35 @@ int ctdb_send_message(struct ctdb_context *ctdb, uint32_t vnn,
}
/*
+ when a client goes away, we need to remove its srvid handler from the list
+ */
+static int message_handler_destructor(struct ctdb_message_list *m)
+{
+ DLIST_REMOVE(m->ctdb->message_list, m);
+}
+
+/*
setup handler for receipt of ctdb messages from ctdb_send_message()
*/
-int ctdb_set_message_handler(struct ctdb_context *ctdb, ctdb_message_fn_t handler,
- uint32_t srvid, void *private)
+int ctdb_register_message_handler(struct ctdb_context *ctdb,
+ TALLOC_CTX *mem_ctx,
+ uint32_t srvid,
+ ctdb_message_fn_t handler,
+ void *private)
{
- ctdb->message_handler = handler;
- ctdb->message_private = private;
+ struct ctdb_message_list *m;
+
+ m = talloc(mem_ctx, struct ctdb_message_list);
+ CTDB_NO_MEMORY(ctdb, m);
+
+ m->ctdb = ctdb;
+ m->srvid = srvid;
+ m->message_handler = handler;
+ m->message_private = private;
+
+ DLIST_ADD(ctdb->message_list, m);
+
+ talloc_set_destructor(m, message_handler_destructor);
+
return 0;
}
-