aboutsummaryrefslogtreecommitdiff
path: root/harness/src/plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'harness/src/plugin.c')
-rw-r--r--harness/src/plugin.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/harness/src/plugin.c b/harness/src/plugin.c
index 1d7c992..b46cb5f 100644
--- a/harness/src/plugin.c
+++ b/harness/src/plugin.c
@@ -46,17 +46,11 @@ static void shx(uint8_t *state, uint32_t sz)
int load_plugin_from_dl_(dlhandle_t dl, plugin_t *plug);
-static void lock(plugin_t *plugin)
-{
- pthread_mutex_lock(&plugin->lock);
-};
+static void lock(plugin_t *plugin) { pthread_mutex_lock(&plugin->lock); };
-static void unlock(plugin_t *plugin)
-{
- pthread_mutex_unlock(&plugin->lock);
-};
+static void unlock(plugin_t *plugin) { pthread_mutex_unlock(&plugin->lock); };
-static int plugin_hot_reload_same_state_action_(plugin_t *plugin, void* ignore)
+static int plugin_hot_reload_same_state_action_(plugin_t *plugin, void *ignore)
{
return plugin_hot_reload_same_state(plugin);
}
@@ -72,14 +66,14 @@ void do_request_hot_reload(void *plugv)
}
}
-static int plugin_do_log(plugin_t* plugin, void* chrs)
+static int plugin_do_log(plugin_t *plugin, void *chrs)
{
- char* str = chrs;
+ char *str = chrs;
puts(str);
return 0;
}
-void do_request_log(void *plugv, const char* str)
+void do_request_log(void *plugv, const char *str)
{
plugin_t *plugin = plugv;
@@ -91,7 +85,7 @@ void do_request_log(void *plugv, const char* str)
}
}
-static int plugin_do_exit(void* plugv, int ec)
+static int plugin_do_exit(void *plugv, int ec)
{
exit(ec);
return 0;
@@ -103,7 +97,8 @@ void do_request_exit(void *plugv, int ec)
size_t n = plugin->n_requested_actions++;
if (n < 8) {
- plugin->requested_actions[n].action = (int(*)(plugin_t*,void*)) plugin_do_exit;
+ plugin->requested_actions[n].action =
+ (int (*)(plugin_t *, void *))plugin_do_exit;
plugin->requested_actions[n].int_arg = ec;
plugin->requested_actions[n].arg_dtor = NULL;
}
@@ -142,6 +137,23 @@ end:
return ec;
}
+static void maybe_run_metaload(int argc, char **argv, plugin_t *plugin)
+{
+ static char *loaded_plugins[12];
+ int i;
+ for (i = 0; i < 12 && loaded_plugins[i]; ++i) {
+ if (strcmp(loaded_plugins[i], plugin->plugin_name) == 0) {
+ return; // Plugin is already loaded
+ }
+ }
+ loaded_plugins[i] = strdup(plugin->plugin_name);
+
+ printf("First time loading %s, running metaload.\n", plugin->plugin_name);
+ if (plugin->plugin_metaload) {
+ plugin->plugin_metaload(argc, argv);
+ }
+}
+
int load_plugin_from_file(int argc, char **argv, const char *filename,
plugin_t *plugin)
{
@@ -164,7 +176,13 @@ int load_plugin_from_file(int argc, char **argv, const char *filename,
return 1;
}
pthread_mutexattr_destroy(&attr);
- return load_plugin_from_file_(argc, argv, filename, plugin);
+ int rc = load_plugin_from_file_(argc, argv, filename, plugin);
+
+ if (rc == 0) {
+ maybe_run_metaload(argc, argv, plugin);
+ }
+
+ return rc;
}
int plugin_hot_reload_same_state(plugin_t *plugin)