Distinguish stopped and finished workers

By having a separate FINISHED state and a STOPPED state, it is possible to
know at which point in the worker's lifetime an event is done. Posting of
messages before a worker is started is allowed but posting them after the
worker has stopped is not.

This fixes avrorouter related failures and all other failures that stem
from worker messages being ignored at startup.
This commit is contained in:
Markus Mäkelä
2019-06-20 08:51:55 +03:00
parent dd944c7302
commit 7673ee685d
3 changed files with 11 additions and 6 deletions

View File

@ -523,9 +523,9 @@ bool Worker::post_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2)
// TODO: Enable and fix this in develop and/or 2.4: The deletion of rworker_local is done after the
// workers have stopped and it triggers this assertion.
// mxb_assert(state() != Worker::STOPPED);
// mxb_assert(state() != Worker::FINISHED);
if (state() != Worker::STOPPED)
if (state() != Worker::FINISHED)
{
MessageQueue::Message message(msg_id, arg1, arg2);
rval = m_pQueue->post(message);
@ -536,7 +536,7 @@ bool Worker::post_message(uint32_t msg_id, intptr_t arg1, intptr_t arg2)
void Worker::run(mxb::Semaphore* pSem)
{
mxb_assert(m_state == STOPPED);
mxb_assert(m_state == STOPPED || m_state == FINISHED);
this_thread.pCurrent_worker = this;
if (pre_run())
@ -550,7 +550,7 @@ void Worker::run(mxb::Semaphore* pSem)
poll_waitevents();
m_state = STOPPED;
m_state = FINISHED;
post_run();
MXB_INFO("Worker %p has shut down.", this);