diff options
Diffstat (limited to 'ctdb/common/ctdb_message.c')
-rw-r--r-- | ctdb/common/ctdb_message.c | 32 |
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; } - |