plugin-loader: Support a reload() callback for static features

This commit is contained in:
Martin Willi
2014-09-22 13:55:12 +02:00
parent 73ed38e74f
commit 5421092b75
9 changed files with 44 additions and 12 deletions
+28 -3
View File
@@ -217,6 +217,16 @@ typedef struct {
*/
char *name;
/**
* Optional reload function for features
*/
bool (*reload)(void *data);
/**
* User data to pass to reload function
*/
void *reload_data;
/**
* Static plugin features
*/
@@ -242,6 +252,16 @@ METHOD(plugin_t, get_static_features, int,
return this->count;
}
METHOD(plugin_t, static_reload, bool,
static_features_t *this)
{
if (this->reload)
{
return this->reload(this->reload_data);
}
return FALSE;
}
METHOD(plugin_t, static_destroy, void,
static_features_t *this)
{
@@ -254,7 +274,8 @@ METHOD(plugin_t, static_destroy, void,
* Create a wrapper around static plugin features.
*/
static plugin_t *static_features_create(const char *name,
plugin_feature_t features[], int count)
plugin_feature_t features[], int count,
bool (*reload)(void*), void *reload_data)
{
static_features_t *this;
@@ -262,9 +283,12 @@ static plugin_t *static_features_create(const char *name,
.public = {
.get_name = _get_static_name,
.get_features = _get_static_features,
.reload = _static_reload,
.destroy = _static_destroy,
},
.name = strdup(name),
.reload = reload,
.reload_data = reload_data,
.features = calloc(count, sizeof(plugin_feature_t)),
.count = count,
);
@@ -904,12 +928,13 @@ static void purge_plugins(private_plugin_loader_t *this)
METHOD(plugin_loader_t, add_static_features, void,
private_plugin_loader_t *this, const char *name,
plugin_feature_t features[], int count, bool critical)
plugin_feature_t features[], int count, bool critical,
bool (*reload)(void*), void *reload_data)
{
plugin_entry_t *entry;
plugin_t *plugin;
plugin = static_features_create(name, features, count);
plugin = static_features_create(name, features, count, reload, reload_data);
INIT(entry,
.plugin = plugin,
+7 -1
View File
@@ -44,6 +44,9 @@ struct plugin_loader_t {
* If critical is TRUE load() will fail if any of the added features could
* not be loaded.
*
* If a reload callback function is given, it gets invoked for the
* registered feature set when reload() is invoked on the plugin_loader.
*
* @note The name should be unique otherwise a plugin with the same name is
* not loaded.
*
@@ -51,10 +54,13 @@ struct plugin_loader_t {
* @param features array of plugin features
* @param count number of features in the array
* @param critical TRUE if the features are critical
* @param reload feature reload callback, or NULL
* @param reload_data user data to pass to reload callback
*/
void (*add_static_features) (plugin_loader_t *this, const char *name,
struct plugin_feature_t *features, int count,
bool critical);
bool critical, bool (*reload)(void*),
void *reload_data);
/**
* Load a list of plugins.