From 10a5272eaca6407982b3707027ea8704f3484377 Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Tue, 13 Feb 2024 17:53:30 -0700 Subject: WIP: Working on the foreign interface. --- harness/src/plugin.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) (limited to 'harness/src/plugin.c') diff --git a/harness/src/plugin.c b/harness/src/plugin.c index bb32b02..808088f 100644 --- a/harness/src/plugin.c +++ b/harness/src/plugin.c @@ -1,9 +1,11 @@ #include "plugin.h" +#include "foreign_intf.h" #include #include #include #include +#include static void shx(uint8_t *state, uint32_t sz) { @@ -41,7 +43,20 @@ static void shx(uint8_t *state, uint32_t sz) } } -int load_plugin_from_file(const char *filename, plugin_t *plugin) +int load_plugin_from_dl_(dlhandle_t dl, plugin_t *plug); + +void do_request_hot_reload(void *plugv) +{ + plugin_t *plugin = plugv; + + if (plugin->n_requested_actions < 8) { + plugin->requested_actions[plugin->n_requested_actions++].action = + plugin_hot_reload_same_state; + } +} + +int load_plugin_from_file(int argc, char **argv, const char *filename, + plugin_t *plugin) { dlhandle_t lib = dlopen(filename, RTLD_LAZY); @@ -51,7 +66,25 @@ int load_plugin_from_file(const char *filename, plugin_t *plugin) } printf("Loading file.\n"); - return load_plugin_from_dl(lib, plugin); + int ec = load_plugin_from_dl_(lib, plugin); + + if (ec) { + return ec; + } + + strncpy(plugin->filename, filename, sizeof(plugin->filename)); + plugin->argc = argc; + plugin->argv = argv; + + plugin->foreign_intf.ctx = plugin; + plugin->foreign_intf.request_hot_reload = do_request_hot_reload; + return 0; +} + +int plugin_hot_reload_same_state(plugin_t *plugin) +{ + return plugin_hot_reload(plugin->argc, plugin->argv, plugin->filename, + plugin); } int plugin_hot_reload(int argc, char **argv, const char *filepath, @@ -76,12 +109,12 @@ int plugin_hot_reload(int argc, char **argv, const char *filepath, printf("Unloading old library handle.\n"); dlclose(plugin->library_handle); - if ((ec = load_plugin_from_file(filepath, plugin))) { + if ((ec = load_plugin_from_file(argc, argv, filepath, plugin))) { goto fail; } printf("Loading plugin ...\n"); - plugin->plugin_load(argc, argv); + plugin->plugin_load(plugin->argc, plugin->argv, &plugin->foreign_intf); printf("Hot starting plugin ...\n"); plugin->state = plugin->plugin_hot_start(marshalled_state, sz); @@ -90,3 +123,12 @@ fail: pthread_mutex_unlock(&plugin->lock); return ec; } + +void plugin_run_requested_actions(plugin_t *plugin) +{ + size_t i; + for (i = 0; i < plugin->n_requested_actions; ++i) { + plugin->requested_actions[i].action(plugin); + } + plugin->n_requested_actions = 0; +} -- cgit