diff options
author | Dave Barach <dave@barachs.net> | 2017-11-18 08:43:06 -0500 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2017-11-18 17:04:34 +0000 |
commit | cabbee7d8caeafa3959f4559177ae335567aefb4 (patch) | |
tree | a2692a381007e78ffb87586cbd6c19521435ed36 /src/vlib | |
parent | 1d6d085d352c8a009cca3bf62fa8975b3b44d90a (diff) |
Call a plugin init function by name
Use this macro to arrange init function ordering between friend
plugins. Fails in the usual manner if the plugin doesn't exist, or if
the init function symbol is AWOL.
clib_error_t *
thisplug_init (vlib_main_t *vm)
{
clib_error_t *error = 0;
if ((error = vlib_plugin_init_function ("otherplug.so", otherplug_init)))
return error;
<etc>
return error;
}
VLIB_INIT_FUNCTION(thisplug_init);
Change-Id: Ideecaf46bc0b1546e85096e54be8ddef87946565
Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vlib')
-rw-r--r-- | src/vlib/unix/plugin.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/vlib/unix/plugin.h b/src/vlib/unix/plugin.h index d9801ec439a..52da7436e61 100644 --- a/src/vlib/unix/plugin.h +++ b/src/vlib/unix/plugin.h @@ -115,6 +115,32 @@ void *vlib_get_plugin_symbol (char *plugin_name, char *symbol_name); vlib_plugin_registration_t vlib_plugin_registration \ __attribute__((__section__(".vlib_plugin_registration"))) +/* Call a plugin init function: used for init function dependencies. */ +#define vlib_call_plugin_init_function(vm,p,x) \ +({ \ + clib_error_t *(*_f)(vlib_main_t *); \ + uword *_fptr = 0; \ + clib_error_t * _error = 0; \ + _fptr= vlib_get_plugin_symbol \ + (p, CLIB_STRING_MACRO(_vlib_init_function_##x)); \ + if (_fptr == 0) \ + { \ + _error = clib_error_return \ + (0, "Plugin %s and/or symbol %s not found.", \ + p, CLIB_STRING_MACRO(_vlib_init_function_##x)); \ + } \ + else \ + { \ + _f = (void *)(_fptr[0]); \ + } \ + if (_fptr && ! hash_get (vm->init_functions_called, _f)) \ + { \ + hash_set1 (vm->init_functions_called, _f); \ + _error = _f (vm); \ + } \ + _error; \ + }) + #endif /* __included_plugin_h__ */ /* |