MXS-1512 Take module object type as template argument
Makes it possible to move the module object pointer into the SpecificModule template.
This commit is contained in:
parent
8a10b72e4d
commit
7ae2acecf7
@ -23,14 +23,13 @@ namespace maxscale
|
||||
/**
|
||||
* An instance of FilterModule represents a filter module.
|
||||
*/
|
||||
class FilterModule : public SpecificModule<FilterModule>
|
||||
class FilterModule : public SpecificModule<FilterModule, MXS_FILTER_OBJECT>
|
||||
{
|
||||
FilterModule(const FilterModule&);
|
||||
FilterModule& operator = (const FilterModule&);
|
||||
|
||||
public:
|
||||
static const char* zName; /*< The name describing the module type. */
|
||||
typedef MXS_FILTER_OBJECT type_t; /*< The type of the module object. */
|
||||
static const char* zName; /*< The name describing the module type. */
|
||||
|
||||
class Session;
|
||||
class Instance
|
||||
@ -184,15 +183,12 @@ private:
|
||||
}
|
||||
|
||||
private:
|
||||
friend class SpecificModule<FilterModule>;
|
||||
friend Base;
|
||||
|
||||
FilterModule(MXS_FILTER_OBJECT* pApi)
|
||||
: m_pApi(pApi)
|
||||
FilterModule(const MXS_MODULE* pModule)
|
||||
: Base(pModule)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
MXS_FILTER_OBJECT* m_pApi;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -31,10 +31,20 @@ public:
|
||||
* @param zFile_name The name of the module.
|
||||
* @param zType_name The expected type of the module.
|
||||
*
|
||||
* @return The module object, if the module could be loaded, otherwise NULL.
|
||||
* @return The module specific entry point structure or NULL.
|
||||
*/
|
||||
static void* load(const char *zFile_name, const char *zType_name);
|
||||
|
||||
/**
|
||||
* Get a module with a specific name, assumed to be of a specific type.
|
||||
*
|
||||
* @param zFile_name The name of the module.
|
||||
* @param zType_name The expected type of the module.
|
||||
*
|
||||
* @return The loaded module, if the module could be loaded, otherwise NULL.
|
||||
*/
|
||||
static const MXS_MODULE* get(const char *zFile_name, const char *zType_name);
|
||||
|
||||
/**
|
||||
* Perform process initialization of all modules. Should be called only
|
||||
* when all modules intended to be loaded have been loaded.
|
||||
@ -60,41 +70,55 @@ public:
|
||||
* Perform thread finalization of all modules.
|
||||
*/
|
||||
static void thread_finish();
|
||||
|
||||
protected:
|
||||
Module(const MXS_MODULE* pModule)
|
||||
: m_module(*pModule)
|
||||
{
|
||||
}
|
||||
|
||||
const MXS_MODULE& m_module;
|
||||
};
|
||||
|
||||
/**
|
||||
* The template Module is intended to be derived from using the derived
|
||||
* class as template argument.
|
||||
*
|
||||
* class XyzModule : public SpecificModule<XyzModule> { ... }
|
||||
* class XyzModule : public SpecificModule<XyzModule, XYZ_MODULE_OBJECT> { ... }
|
||||
*
|
||||
* @param zFile_name The name of the module.
|
||||
*
|
||||
* @return A module instance if the module could be loaded and it was of
|
||||
* the expected type.
|
||||
*/
|
||||
template<class T>
|
||||
template<class T, class API>
|
||||
class SpecificModule : public Module
|
||||
{
|
||||
public:
|
||||
typedef SpecificModule<T, API> Base;
|
||||
|
||||
static std::auto_ptr<T> load(const char* zFile_name)
|
||||
{
|
||||
std::auto_ptr<T> sT;
|
||||
|
||||
void* pApi = Module::load(zFile_name, T::zName);
|
||||
const MXS_MODULE* pModule = Module::get(zFile_name, T::zName);
|
||||
|
||||
if (pApi)
|
||||
if (pModule)
|
||||
{
|
||||
sT.reset(new T(static_cast<typename T::type_t*>(pApi)));
|
||||
sT.reset(new T(pModule));
|
||||
}
|
||||
|
||||
return sT;
|
||||
}
|
||||
|
||||
protected:
|
||||
SpecificModule()
|
||||
SpecificModule(const MXS_MODULE* pModule)
|
||||
: Module(pModule)
|
||||
, m_pApi(static_cast<API*>(pModule->module_object))
|
||||
{
|
||||
}
|
||||
|
||||
API* m_pApi;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -24,25 +24,19 @@ namespace maxscale
|
||||
* A QueryClassfierModule instance is an abstraction for a query
|
||||
* classifier module.
|
||||
*/
|
||||
class QueryClassifierModule : public SpecificModule<QueryClassifierModule>
|
||||
class QueryClassifierModule : public SpecificModule<QueryClassifierModule, QUERY_CLASSIFIER>
|
||||
{
|
||||
QueryClassifierModule(const QueryClassifierModule&);
|
||||
QueryClassifierModule& operator = (const QueryClassifierModule&);
|
||||
|
||||
public:
|
||||
static const char* zName; /*< The name describing the module type. */
|
||||
typedef QUERY_CLASSIFIER type_t; /*< The type of the module object. */
|
||||
static const char* zName; /*< The name describing the module type. */
|
||||
|
||||
private:
|
||||
friend class SpecificModule<QueryClassifierModule>;
|
||||
|
||||
QueryClassifierModule(QUERY_CLASSIFIER* pApi)
|
||||
: m_pApi(pApi)
|
||||
QueryClassifierModule(const MXS_MODULE* pModule)
|
||||
: Base(pModule)
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
QUERY_CLASSIFIER* m_pApi;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -23,6 +23,12 @@ void* Module::load(const char* zName, const char* zType)
|
||||
return load_module(zName, zType);
|
||||
}
|
||||
|
||||
//static
|
||||
const MXS_MODULE* Module::get(const char* zName, const char* zType)
|
||||
{
|
||||
return get_module(zName, zType);
|
||||
}
|
||||
|
||||
//static
|
||||
bool Module::process_init()
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user