diff options
| author | Josh Rahm <rahm@google.com> | 2024-02-13 17:53:30 -0700 |
|---|---|---|
| committer | Josh Rahm <rahm@google.com> | 2024-02-13 17:54:04 -0700 |
| commit | 10a5272eaca6407982b3707027ea8704f3484377 (patch) | |
| tree | 413ebfa9cffe703e596d33d7fd5e06249d7af477 /harness/src/plugin.c | |
| parent | d065af8c16bcb8ef54024c0f2082d827f83f37f9 (diff) | |
| download | montis-10a5272eaca6407982b3707027ea8704f3484377.tar.gz montis-10a5272eaca6407982b3707027ea8704f3484377.tar.bz2 montis-10a5272eaca6407982b3707027ea8704f3484377.zip | |
WIP: Working on the foreign interface.
Diffstat (limited to 'harness/src/plugin.c')
| -rw-r--r-- | harness/src/plugin.c | 50 |
1 files changed, 46 insertions, 4 deletions
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 <ctype.h> #include <dlfcn.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> 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; +} |