MXS-1848 Implement createInstance() and destroyInstance()

CreateInstance() (renamed from initMonitor()) and destroyInstance()
(renamed from finishMonitor()) have now tentatively been
implemented for all monitors.

Next step is to

1) change the prototype of startMonitor() to

       bool (*startMonitor)(MXS_SPECIFIC_MONITOR*,
                            const MXS_MONITOR_PARAMETER*);

   and assume that mon->handle will always contain the
   instance,
2) not delete any data in stopMonitor(),
3) add monitorCreateAll() that calls createInstance() for all
   monitors (and call that in main()), and
4) add monitorDestroyAll() that calls destroyInstance() for
   all monitors (and call that in main()).
This commit is contained in:
Johan Wikman
2018-05-04 15:06:44 +03:00
parent 02cd7b9275
commit 60228f0f26
12 changed files with 300 additions and 115 deletions

View File

@ -36,6 +36,8 @@ struct GRMon : public MXS_SPECIFIC_MONITOR
GRMon& operator&(const GRMon&);
public:
static GRMon* create(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params);
static GRMon* create_and_start(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params);
void start();
void stop();
~GRMon();
@ -70,11 +72,20 @@ GRMon* GRMon::create(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params)
{
GRMon* mon;
MXS_EXCEPTION_GUARD(mon = new GRMon(monitor, params));
return mon;
}
if (mon && thread_start(&mon->m_thread, GRMon::main, mon, 0) == NULL)
GRMon* GRMon::create_and_start(MXS_MONITOR* monitor, const MXS_CONFIG_PARAMETER* params)
{
GRMon* mon = create(monitor, params);
if (mon)
{
delete mon;
mon = NULL;
if (thread_start(&mon->m_thread, GRMon::main, mon, 0) == NULL)
{
delete mon;
mon = NULL;
}
}
return mon;
@ -92,6 +103,18 @@ void GRMon::stop()
thread_wait(m_thread);
}
static MXS_SPECIFIC_MONITOR* createInstance(MXS_MONITOR *mon,
const MXS_CONFIG_PARAMETER *params)
{
return GRMon::create(mon, params);
}
static void destroyInstance(MXS_SPECIFIC_MONITOR* mon)
{
GRMon* handle = static_cast<GRMon*>(mon);
delete handle;
}
/**
* Start the instance of the monitor, returning a handle on the monitor.
*
@ -102,7 +125,7 @@ void GRMon::stop()
static MXS_SPECIFIC_MONITOR *
startMonitor(MXS_MONITOR *mon, const MXS_CONFIG_PARAMETER *params)
{
return GRMon::create(mon, params);
return GRMon::create_and_start(mon, params);
}
/**
@ -118,18 +141,6 @@ stopMonitor(MXS_SPECIFIC_MONITOR *mon)
delete handle;
}
static MXS_SPECIFIC_MONITOR* initMonitor(MXS_MONITOR *mon,
const MXS_CONFIG_PARAMETER *params)
{
ss_dassert(!true);
return NULL;
}
static void finishMonitor(MXS_SPECIFIC_MONITOR* mon)
{
ss_dassert(!true);
}
/**
* Diagnostic interface
*
@ -333,8 +344,8 @@ extern "C"
{
static MXS_MONITOR_OBJECT MyObject =
{
initMonitor,
finishMonitor,
createInstance,
destroyInstance,
startMonitor,
stopMonitor,
diagnostics,