ScheduledWorkItem::ScheduleClear: remove item from runnable queue

The existing behavior is unexpected: if the work item is already on the
runnable queue, it will still be triggered after a call to ScheduleClear().
This can lead to race conditions.
This commit is contained in:
Beat Küng 2020-03-09 12:06:15 +01:00 committed by Daniel Agar
parent 977b80cee9
commit 18bc6cf872
4 changed files with 15 additions and 0 deletions

View File

@ -81,6 +81,10 @@ protected:
virtual ~WorkItem();
/**
* Remove work item from the runnable queue, if it's there
*/
void ScheduleClear();
protected:
void RunPreamble() { _run_count++; }

View File

@ -66,7 +66,9 @@ ScheduledWorkItem::ScheduleOnInterval(uint32_t interval_us, uint32_t delay_us)
void
ScheduledWorkItem::ScheduleClear()
{
// first clear any scheduled hrt call, then remove the item from the runnable queue
hrt_cancel(&_call);
WorkItem::ScheduleClear();
}
void

View File

@ -89,6 +89,14 @@ WorkItem::Deinit()
}
}
void
WorkItem::ScheduleClear()
{
if (_wq != nullptr) {
_wq->Remove(this);
}
}
float
WorkItem::elapsed_time() const
{

View File

@ -160,6 +160,7 @@ WorkQueue::Run()
work_unlock(); // unlock work queue to run (item may requeue itself)
work->RunPreamble();
work->Run();
// Note: after Run() we cannot access work anymore, as it might have been deleted
work_lock(); // re-lock
}