summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2014-10-04 20:43:17 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2014-10-04 20:43:17 +0200
commit578f8d8b0bec9ba3e5a1f8b4bf26b66f58dd6752 (patch)
treea51aa18fa56847586e1ce87e4c4ee2a6997244ab /include
parentccf23e71918d2af7ad9d261a2b012836cd168d60 (diff)
downloadcrawler-578f8d8b0bec9ba3e5a1f8b4bf26b66f58dd6752.tar.gz
crawler-578f8d8b0bec9ba3e5a1f8b4bf26b66f58dd6752.tar.bz2
added init and destroy functions to modules
Diffstat (limited to 'include')
-rwxr-xr-xinclude/module/ModuleLoader.hpp8
-rwxr-xr-xinclude/module/ModuleRegistry.hpp94
2 files changed, 77 insertions, 25 deletions
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<baseClass> 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<baseClass> registry ## _ ## baseClass( name, &create, &destroy );
+ModuleRegistry<baseClass> registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy );
// 1 param macro
#define DECLARE_MODULE_1( baseClass, T1 ) \
extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_1( T1 ) > 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<baseClass, TYPELIST_1( T1 )> registry ## _ ## baseClass( name, &create, &destroy );
+ModuleRegistry<baseClass, TYPELIST_1( T1 )> registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy );
// 2 param macro
#define DECLARE_MODULE_2( baseClass, T1, T2 ) \
extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_2( T1, T2 ) > 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<baseClass, TYPELIST_2( T1, T2 )> registry ## _ ## baseClass( name, &create, &destroy );
+ModuleRegistry<baseClass, TYPELIST_2( T1, T2 )> registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy );
// 3 param macro
#define DECLARE_MODULE_3( baseClass, T1, T2, T3 ) \
extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_3( T1, T2, T3 ) > 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<baseClass, TYPELIST_3( T1, T2, T3 )> registry ## _ ## baseClass( name, &create, &destroy );
+ModuleRegistry<baseClass, TYPELIST_3( T1, T2, T3 )> registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy );
// 4 param macro
#define DECLARE_MODULE_4( baseClass, T1, T2, T3, T4 ) \
extern "C" DLLEXPORT ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 ) > 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<baseClass, TYPELIST_4( T1, T2, T3, T4 )> registry ## _ ## baseClass( name, &create, &destroy );
+ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 )> registry ## _ ## baseClass( name, initModule, destroyModule, &create, &destroy );
#else // SHARED
@@ -179,11 +214,20 @@ ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 )> 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<baseClass> registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 );
+
+#define REGISTER_MODULE_1( name, initModule, destroyModule, baseClass, subClass, T1 ) \
+ModuleRegistry<baseClass, TYPELIST_1( T1 )> registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 );
+
+#define REGISTER_MODULE_2( name, initModule, destroyModule, baseClass, subClass, T1, T2 ) \
+ModuleRegistry<baseClass, TYPELIST_2( T1, T2 )> registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 );
+
+#define REGISTER_MODULE_3( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3 ) \
+ModuleRegistry<baseClass, TYPELIST_3( T1, T2, T3 )> registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 );
+
+#define REGISTER_MODULE_4( name, initModule, destroyModule, baseClass, subClass, T1, T2, T3, T4 ) \
+ModuleRegistry<baseClass, TYPELIST_4( T1, T2, T3, T4 )> registry ## _ ## baseClass( name, initModule, destroyModule, 0, 0 );
#endif // SHARED