fix task_scheduler_test. Fix potential reference invalidation in task_scheduler internal tasks data structure

This commit is contained in:
Francisco Paisana 2020-08-11 12:14:21 +01:00
parent a6c3144d92
commit a9d882c1f1
2 changed files with 6 additions and 8 deletions

View File

@ -118,19 +118,19 @@ private:
void run_all_internal_tasks()
{
// Perform pending stack deferred tasks
// Note: Keep it indexed-based, bc a task may enqueue another task, which may cause vector reallocation,
// and iterator invalidation
for (size_t i = 0; i < internal_tasks.size(); ++i) {
internal_tasks[i]();
// Note: Using a deque because tasks can enqueue new tasks, which would lead to
// reference invalidation in case of vector
while (not internal_tasks.empty()) {
internal_tasks.front()();
internal_tasks.pop_front();
}
internal_tasks.clear();
}
srslte::task_thread_pool background_tasks; ///< Thread pool used for long, low-priority tasks
int background_queue_id = -1; ///< Queue for handling the outcomes of tasks run in the background
srslte::task_multiqueue external_tasks;
srslte::timer_handler timers;
std::vector<srslte::move_task_t> internal_tasks; ///< enqueues stack tasks from within main thread. Avoids locking
std::deque<srslte::move_task_t> internal_tasks; ///< enqueues stack tasks from within main thread. Avoids locking
};
//! Task scheduler handle given to classes/functions running within the main control thread

View File

@ -69,8 +69,6 @@ int test_task_scheduler_with_pool()
task_sched.notify_background_task_result([&state]() { state = task_result::external; });
});
TESTASSERT(state == task_result::null);
task_sched.run_pending_tasks();
TESTASSERT(state == task_result::null);
task_sched.run_next_task(); // waits and runs notification
TESTASSERT(state == task_result::external);