lightningd/plugin.c: Make plugin-exclusive loop support multiple plugins.

This commit is contained in:
ZmnSCPxj jxPCSnmZ
2020-11-23 11:46:13 +08:00
committed by Rusty Russell
parent 5c2fc4c1cb
commit 904e110554
3 changed files with 32 additions and 13 deletions

View File

@@ -1715,20 +1715,28 @@ void plugin_request_send(struct plugin *plugin,
req->stream = NULL;
}
void *plugin_exclusive_loop(struct plugin *plugin)
void *plugins_exclusive_loop(struct plugin **plugins)
{
void *ret;
size_t i;
bool last = false;
assert(tal_count(plugins) != 0);
io_conn_out_exclusive(plugin->stdin_conn, true);
io_conn_exclusive(plugin->stdout_conn, true);
for (i = 0; i < tal_count(plugins); ++i) {
io_conn_out_exclusive(plugins[i]->stdin_conn, true);
io_conn_exclusive(plugins[i]->stdout_conn, true);
}
/* We don't service timers here, either! */
ret = io_loop(NULL, NULL);
io_conn_out_exclusive(plugin->stdin_conn, false);
if (io_conn_exclusive(plugin->stdout_conn, false))
for (i = 0; i < tal_count(plugins); ++i) {
io_conn_out_exclusive(plugins[i]->stdin_conn, false);
last = io_conn_exclusive(plugins[i]->stdout_conn, false);
}
if (last)
fatal("Still io_exclusive after removing plugin %s?",
plugin->cmd);
plugins[tal_count(plugins) - 1]->cmd);
return ret;
}