From 578f8d8b0bec9ba3e5a1f8b4bf26b66f58dd6752 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 4 Oct 2014 20:43:17 +0200 Subject: added init and destroy functions to modules --- include/module/ModuleLoader.hpp | 8 ++++ include/module/ModuleRegistry.hpp | 94 ++++++++++++++++++++++++++++----------- 2 files changed, 77 insertions(+), 25 deletions(-) (limited to 'include') diff --git a/include/module/ModuleLoader.hpp b/include/module/ModuleLoader.hpp index d3b7d00..02b368e 100755 --- a/include/module/ModuleLoader.hpp +++ b/include/module/ModuleLoader.hpp @@ -79,6 +79,10 @@ class BaseModuleLoader { #endif throw std::runtime_error( "missing module registry" ); } + + if( m.registry->initModule != 0 ) { + m.registry->initModule( ); + } m_modules.insert( std::make_pair( m.registry->name, m ) ); } @@ -88,6 +92,10 @@ class BaseModuleLoader { { for( typename mapType::iterator it = m_modules.begin( ); it != m_modules.end( ); it++ ) { if( (*it).second.handle ) { + if( (*it).second.registry->destroyModule != 0 ) { + (*it).second.registry->destroyModule( ); + } + #ifndef _WIN32 dlclose( (*it).second.handle ); #else diff --git a/include/module/ModuleRegistry.hpp b/include/module/ModuleRegistry.hpp index e217092..d8ee90c 100755 --- a/include/module/ModuleRegistry.hpp +++ b/include/module/ModuleRegistry.hpp @@ -11,12 +11,19 @@ struct ModuleRegistry; template< typename Interface> struct ModuleRegistry< Interface > { std::string name; + void (*initModule)( ); + void (*destroyModule)( ); Interface *(*create)( ); void (*destroy)( Interface *obj ); - ModuleRegistry( std::string _name, Interface *(*_create)( ), + ModuleRegistry( std::string _name, + void (*_initModule)( ), + void (*_destroyModule)( ), + Interface *(*_create)( ), void (*_destroy)( Interface *obj ) ) - : name( _name ), create( _create ), destroy( _destroy ) + : name( _name ), + initModule( _initModule ), destroyModule( _destroyModule ), + create( _create ), destroy( _destroy ) { } }; @@ -24,12 +31,19 @@ struct ModuleRegistry< Interface > { template< typename Interface, typename P1 > struct ModuleRegistry< Interface, TYPELIST_1( P1 ) > { std::string name; + void (*initModule)( ); + void (*destroyModule)( ); Interface *(*create)( P1 ); void (*destroy)( Interface *obj ); - ModuleRegistry( std::string _name, Interface *(*_create)( P1 ), + ModuleRegistry( std::string _name, + void (*_initModule)( ), + void (*_destroyModule)( ), + Interface *(*_create)( P1 ), void (*_destroy)( Interface *obj ) ) - : name( _name ), create( _create ), destroy( _destroy ) + : name( _name ), + initModule( _initModule ), destroyModule( _destroyModule ), + create( _create ), destroy( _destroy ) { } }; @@ -37,12 +51,19 @@ struct ModuleRegistry< Interface, TYPELIST_1( P1 ) > { template< typename Interface, typename P1, typename P2 > struct ModuleRegistry< Interface, TYPELIST_2( P1, P2 ) > { std::string name; + void (*initModule)( ); + void (*destroyModule)( ); Interface *(*create)( P1, P2 ); void (*destroy)( Interface *obj ); - ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2 ), + ModuleRegistry( std::string _name, + void (*_initModule)( ), + void (*_destroyModule)( ), + Interface *(*_create)( P1, P2 ), void (*_destroy)( Interface *obj ) ) - : name( _name ), create( _create ), destroy( _destroy ) + : name( _name ), + initModule( _initModule ), destroyModule( _destroyModule ), + create( _create ), destroy( _destroy ) { } }; @@ -50,12 +71,19 @@ struct ModuleRegistry< Interface, TYPELIST_2( P1, P2 ) > { template< typename Interface, typename P1, typename P2, typename P3 > struct ModuleRegistry< Interface, TYPELIST_3( P1, P2, P3 ) > { std::string name; + void (*initModule)( ); + void (*destroyModule)( ); Interface *(*create)( P1, P2, P3 ); void (*destroy)( Interface *obj ); - ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2, P3 ), + ModuleRegistry( std::string _name, + void (*_initModule)( ), + void (*_destroyModule)( ), + Interface *(*_create)( P1, P2, P3 ), void (*_destroy)( Interface *obj ) ) - : name( _name ), create( _create ), destroy( _destroy ) + : name( _name ), + initModule( _initModule ), destroyModule( _destroyModule ), + create( _create ), destroy( _destroy ) { } }; @@ -63,12 +91,19 @@ struct ModuleRegistry< Interface, TYPELIST_3( P1, P2, P3 ) > { template< typename Interface, typename P1, typename P2, typename P3, typename P4 > struct ModuleRegistry< Interface, TYPELIST_4( P1, P2, P3, P4 ) > { std::string name; + void (*initModule)( ); + void (*destroyModule)( ); Interface *(*create)( P1, P2, P3, P4 ); void (*destroy)( Interface *obj ); - ModuleRegistry( std::string _name, Interface *(*_create)( P1, P2, P3, P4 ), + ModuleRegistry( std::string _name, + void (*_initModule)( ), + void (*_destroyModule)( ), + Interface *(*_create)( P1, P2, P3, P4 ), void (*_destroy)( Interface *obj ) ) - : name( _name ), create( _create ), destroy( _destroy ) + : name( _name ), + initModule( _initModule ), destroyModule( _destroyModule ), + create( _create ), destroy( _destroy ) { } }; @@ -86,7 +121,7 @@ struct ModuleRegistry< Interface, TYPELIST_4( P1, P2, P3, P4 ) > { #define DECLARE_MODULE( baseClass ) \ extern "C" DLLEXPORT ModuleRegistry registry ## _ ## baseClass; -#define REGISTER_MODULE( name, baseClass, subClass ) \ +#define REGISTER_MODULE( name, initModule, destroyModule, baseClass, subClass ) \ static baseClass *create( ) \ { \ return new subClass( ); \ @@ -97,14 +132,14 @@ static void destroy( baseClass *obj ) \ delete obj; \ } \ \ -ModuleRegistry registry ## _ ## baseClass( name, &create, &destroy ); +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy ); // 1 param macro #define DECLARE_MODULE_1( baseClass, T1 ) \ extern "C" DLLEXPORT ModuleRegistry registry ## _ ## baseClass; -#define REGISTER_MODULE_1( name, baseClass, subClass, T1 ) \ +#define REGISTER_MODULE_1( name, initModule, destroyModule, baseClass, subClass, T1 ) \ static baseClass *create( T1 t1 ) \ { \ return new subClass( t1 ); \ @@ -115,14 +150,14 @@ static void destroy( baseClass *obj ) \ delete obj; \ } \ \ -ModuleRegistry registry ## _ ## baseClass( name, &create, &destroy ); +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy ); // 2 param macro #define DECLARE_MODULE_2( baseClass, T1, T2 ) \ extern "C" DLLEXPORT ModuleRegistry registry ## _ ## baseClass; -#define REGISTER_MODULE_2( name, baseClass, subClass, T1, T2 ) \ +#define REGISTER_MODULE_2( name, initModule, destroyModule, baseClass, subClass, T1, T2 ) \ static baseClass *create( T1 t1, T2 t2 ) \ { \ return new subClass( t1, t2 ); \ @@ -133,14 +168,14 @@ static void destroy( baseClass *obj ) \ delete obj; \ } \ \ -ModuleRegistry registry ## _ ## baseClass( name, &create, &destroy ); +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy ); // 3 param macro #define DECLARE_MODULE_3( baseClass, T1, T2, T3 ) \ extern "C" DLLEXPORT ModuleRegistry registry ## _ ## baseClass; -#define REGISTER_MODULE_3( name, baseClass, subClass, T1, T2, T3 ) \ +#define REGISTER_MODULE_3( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3 ) \ static baseClass *create( T1 t1, T2 t2, T3 t3 ) \ { \ return new subClass( t1, t2, t3 ); \ @@ -151,14 +186,14 @@ static void destroy( baseClass *obj ) \ delete obj; \ } \ \ -ModuleRegistry registry ## _ ## baseClass( name, &create, &destroy ); +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy ); // 4 param macro #define DECLARE_MODULE_4( baseClass, T1, T2, T3, T4 ) \ extern "C" DLLEXPORT ModuleRegistry registry ## _ ## baseClass; -#define REGISTER_MODULE_4( name, baseClass, subClass, T1, T2, T3, T4 ) \ +#define REGISTER_MODULE_4( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3, T4 ) \ static baseClass *create( T1 t1, T2 t2, T3 t3, T4 t4 ) \ { \ return new subClass( t1, t2, t3, t4 ); \ @@ -169,7 +204,7 @@ static void destroy( baseClass *obj ) \ delete obj; \ } \ \ -ModuleRegistry registry ## _ ## baseClass( name, &create, &destroy ); +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy ); #else // SHARED @@ -179,11 +214,20 @@ ModuleRegistry registry ## _ ## baseCla #define DECLARE_MODULE_3( baseClass, T1, T2, T3 ) #define DECLARE_MODULE_4( baseClass, T1, T2, T3, T4 ) -#define REGISTER_MODULE( name, baseClass, subClass ) -#define REGISTER_MODULE_1( name, baseClass, subClass, T1 ) -#define REGISTER_MODULE_2( name, baseClass, subClass, T1, T2 ) -#define REGISTER_MODULE_3( name, baseClass, subClass, T1, T2, T3 ) -#define REGISTER_MODULE_4( name, baseClass, subClass, T1, T2, T3, T4 ) +#define REGISTER_MODULE( name, initModule, destroyModule, baseClass, subClass ) \ +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 ); + +#define REGISTER_MODULE_1( name, initModule, destroyModule, baseClass, subClass, T1 ) \ +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 ); + +#define REGISTER_MODULE_2( name, initModule, destroyModule, baseClass, subClass, T1, T2 ) \ +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 ); + +#define REGISTER_MODULE_3( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3 ) \ +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 ); + +#define REGISTER_MODULE_4( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3, T4 ) \ +ModuleRegistry registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 ); #endif // SHARED -- cgit v1.2.3-54-g00ecf