Pass std::string to add/remove task

By passing strings instead of const char pointers to the task control
functions, we can safely make copies of them knowing that the contents
won't disappear.
This commit is contained in:
Markus Mäkelä
2019-03-26 09:06:32 +02:00
parent f0756cd708
commit 0915487329
2 changed files with 19 additions and 18 deletions

View File

@ -51,8 +51,8 @@ public:
*/ */
static MainWorker& get(); static MainWorker& get();
void add_task(const char* zName, TASKFN func, void* pData, int frequency); void add_task(const std::string& name, TASKFN func, void* pData, int frequency);
void remove_task(const char* zName); void remove_task(const std::string& name);
void show_tasks(DCB* pDcb) const; void show_tasks(DCB* pDcb) const;
json_t* tasks_to_json(const char* zhost) const; json_t* tasks_to_json(const char* zhost) const;

View File

@ -59,14 +59,14 @@ MainWorker& MainWorker::get()
return *this_unit.pCurrent_main; return *this_unit.pCurrent_main;
} }
void MainWorker::add_task(const char* zName, TASKFN func, void* pData, int frequency) void MainWorker::add_task(const std::string& name, TASKFN func, void* pData, int frequency)
{ {
execute([=]() { execute([=]() {
mxb_assert(m_tasks_by_name.find(zName) == m_tasks_by_name.end()); mxb_assert_message(m_tasks_by_name.find(name) == m_tasks_by_name.end(), name.c_str());
Task task(zName, func, pData, frequency); Task task(name.c_str(), func, pData, frequency);
auto p = m_tasks_by_name.insert(std::make_pair(std::string(zName), task)); auto p = m_tasks_by_name.insert(std::make_pair(name, task));
Task& inserted_task = (*p.first).second; Task& inserted_task = (*p.first).second;
inserted_task.id = delayed_call(frequency * 1000, inserted_task.id = delayed_call(frequency * 1000,
@ -77,21 +77,22 @@ void MainWorker::add_task(const char* zName, TASKFN func, void* pData, int frequ
EXECUTE_AUTO); EXECUTE_AUTO);
} }
void MainWorker::remove_task(const char* zName) void MainWorker::remove_task(const std::string& name)
{ {
call([this, zName]() {
auto it = m_tasks_by_name.find(zName);
mxb_assert(it != m_tasks_by_name.end());
if (it != m_tasks_by_name.end()) call([this, name]() {
{ auto it = m_tasks_by_name.find(name);
MXB_AT_DEBUG(bool cancelled =) cancel_delayed_call(it->second.id); mxb_assert(it != m_tasks_by_name.end());
mxb_assert(cancelled);
m_tasks_by_name.erase(it); if (it != m_tasks_by_name.end())
} {
}, MXB_AT_DEBUG(bool cancelled = ) cancel_delayed_call(it->second.id);
EXECUTE_AUTO); mxb_assert(cancelled);
m_tasks_by_name.erase(it);
}
},
EXECUTE_AUTO);
} }
void MainWorker::show_tasks(DCB* pDcb) const void MainWorker::show_tasks(DCB* pDcb) const