aboutsummaryrefslogtreecommitdiff
path: root/harness/src/plugin.c
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2024-02-13 17:53:30 -0700
committerJosh Rahm <rahm@google.com>2024-02-13 17:54:04 -0700
commit10a5272eaca6407982b3707027ea8704f3484377 (patch)
tree413ebfa9cffe703e596d33d7fd5e06249d7af477 /harness/src/plugin.c
parentd065af8c16bcb8ef54024c0f2082d827f83f37f9 (diff)
downloadmontis-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.c50
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;
+}