From 8f875795892b352b2a6381d514faec18a14a0a3e Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Wed, 19 Feb 2020 18:43:20 +0100 Subject: [PATCH] cleanup: Remove current_plugin from plugin_hook_request It was a pointer into the list of plugins for the hook, but it was rather unstable: if a plugin exits after handling the event we could end up skipping a later plugin. We now rely on the much more stable `call_chain` list, so we can clean up that useless field. --- lightningd/plugin_hook.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/lightningd/plugin_hook.c b/lightningd/plugin_hook.c index 7801ca187..2fbf139c1 100644 --- a/lightningd/plugin_hook.c +++ b/lightningd/plugin_hook.c @@ -12,7 +12,6 @@ struct plugin_hook_request { struct list_head call_chain; struct plugin *plugin; - int current_plugin; const struct plugin_hook *hook; void *cb_arg; void *payload; @@ -133,7 +132,6 @@ static void plugin_hook_killed(struct plugin_hook_call_link *link) /* Call next will unlink, so we don't need to. This is treated * equivalent to the plugin returning a continue-result. */ - link->req->current_plugin--; plugin_hook_callback(NULL, NULL, NULL, link->req); } else { /* The plugin is in the list waiting to be called, just remove @@ -188,12 +186,11 @@ static void plugin_hook_callback(const char *buffer, const jsmntok_t *toks, resrestok = NULL; } - more_plugins = r->current_plugin + 1 < tal_count(r->hook->plugins); - cont = buffer == NULL || (resrestok && json_tok_streq(buffer, resrestok, "continue")); - /* If this is a hook response containing a `continue` and we have more * plugins queue the next call. In that case we discard the remainder * of the result, and let the next plugin decide. */ + cont = buffer == NULL || (resrestok && json_tok_streq(buffer, resrestok, "continue")); + more_plugins = !list_empty(&r->call_chain); if (cont && more_plugins) { plugin_hook_call_next(r); } else { @@ -217,9 +214,8 @@ static void plugin_hook_call_next(struct plugin_hook_request *ph_req) { struct jsonrpc_request *req; const struct plugin_hook *hook = ph_req->hook; - ph_req->current_plugin++; - assert(ph_req->current_plugin < tal_count(hook->plugins)); - ph_req->plugin = ph_req->hook->plugins[ph_req->current_plugin]; + assert(!list_empty(&ph_req->call_chain)); + ph_req->plugin = list_top(&ph_req->call_chain, struct plugin_hook_call_link, list)->plugin; req = jsonrpc_request_start(NULL, hook->name, plugin_get_log(ph_req->plugin), @@ -246,7 +242,6 @@ void plugin_hook_call_(struct lightningd *ld, const struct plugin_hook *hook, ph_req->cb_arg = cb_arg; ph_req->db = ld->wallet->db; ph_req->payload = tal_steal(ph_req, payload); - ph_req->current_plugin = -1; ph_req->ld = ld; list_head_init(&ph_req->call_chain); @@ -349,8 +344,7 @@ void plugin_hook_db_sync(struct db *db) ph_req->hook = hook; ph_req->db = db; - ph_req->current_plugin = 0; - plugin = ph_req->plugin = hook->plugins[ph_req->current_plugin]; + plugin = ph_req->plugin = hook->plugins[0]; json_add_num(req->stream, "data_version", db_data_version_get(db));