diff options
| author | Josh Rahm <joshuarahm@gmail.com> | 2024-02-14 10:39:01 -0700 |
|---|---|---|
| committer | Josh Rahm <joshuarahm@gmail.com> | 2024-02-14 10:39:01 -0700 |
| commit | 020bc92281ae584dc97aa30e1a1ad2a5373335fd (patch) | |
| tree | 1eb1036d55e116fc055feee6e9502b8445d89872 /harness/include/plugin.h | |
| parent | 10a5272eaca6407982b3707027ea8704f3484377 (diff) | |
| download | montis-020bc92281ae584dc97aa30e1a1ad2a5373335fd.tar.gz montis-020bc92281ae584dc97aa30e1a1ad2a5373335fd.tar.bz2 montis-020bc92281ae584dc97aa30e1a1ad2a5373335fd.zip | |
Framework for plugin to call into harness.
This is done by passing an interface to the plugin from the harness. The
plugin can then request the harness do some things (such as reload), and
the harness will do that.
Diffstat (limited to 'harness/include/plugin.h')
| -rw-r--r-- | harness/include/plugin.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/harness/include/plugin.h b/harness/include/plugin.h index db56845..1e4a161 100644 --- a/harness/include/plugin.h +++ b/harness/include/plugin.h @@ -7,7 +7,7 @@ #include <stdint.h> #include <stdlib.h> -#include "foreign_intf.h" +#include <foreign_intf.h> /* * Marker macro to define what functions should be exported. This generates the @@ -15,6 +15,12 @@ */ #define EXPORT(a) a +#define EXPORT_INCLUDE(a) + +EXPORT_INCLUDE(<foreign_intf.h>) + +#define MAX_QUEUED_ACTIONS 8 + typedef void *dlhandle_t; /* Opaque state for a plugin. Not to be touched by the harness (not that it @@ -25,7 +31,9 @@ struct PLUGIN; /* This structure represents an action requested by the plugin for the harness. */ typedef struct { - int (*action)(struct PLUGIN *requester); + int (*action)(struct PLUGIN *requester, void* arg); + void (*arg_dtor)(void* arg); + void* arg; } requested_action_t; /* @@ -62,6 +70,9 @@ typedef struct PLUGIN { * outcomes. */ pthread_mutex_t lock; + /** Set to not-zero if this plugin is initialized, otherwise set to zero. */ + int initialized; + /* The handle to the shared library. */ dlhandle_t library_handle; @@ -73,7 +84,7 @@ typedef struct PLUGIN { /** Intializes the plugin with the given argc/argv. This is the first thing * called on the plugin and is called immediately after the library is loaded. */ - EXPORT(void (*plugin_load)(int argc, char **argv, foreign_interface_t *intf)); + EXPORT(void (*plugin_load)(int argc, char** argv, foreign_interface_t *intf)); /* Start the plugin with the marshalled state from the previous plugin. * @@ -122,10 +133,11 @@ typedef struct PLUGIN { * allowed at one time. That should be plenty. The actions should be flushed * after each call to a handler anyway. */ size_t n_requested_actions; - requested_action_t requested_actions[8]; + requested_action_t requested_actions[MAX_QUEUED_ACTIONS]; } plugin_t; #undef EXPORT +#undef EXPORT_INCLUDE /* Reloads the plugin. This tears down the existing plugin, marshals the state * for it and reloads it. @@ -141,6 +153,9 @@ int plugin_hot_reload(int argc, char **argv, const char *filepath, */ int plugin_hot_reload_same_state(plugin_t *plugin); +/* Starts a plugin in a cold state. Called after load_plugin_from_file. */ +void plugin_cold_start(plugin_t* plugin); + /* Reads a plugin from a filename. */ int load_plugin_from_file(int argc, char **argv, const char *filename, plugin_t *plugin); |