diff --git a/test/time_controller/simulated_task_queue.cc b/test/time_controller/simulated_task_queue.cc index 6bc96c73b9..59fabc2292 100644 --- a/test/time_controller/simulated_task_queue.cc +++ b/test/time_controller/simulated_task_queue.cc @@ -27,11 +27,17 @@ SimulatedTaskQueue::~SimulatedTaskQueue() { } void SimulatedTaskQueue::Delete() { + // Need to destroy the tasks outside of the lock because task destruction + // can lead to re-entry in SimulatedTaskQueue via custom destructors. + std::deque> ready_tasks; + std::map>> delayed_tasks; { rtc::CritScope lock(&lock_); - ready_tasks_.clear(); - delayed_tasks_.clear(); + ready_tasks_.swap(ready_tasks); + delayed_tasks_.swap(delayed_tasks); } + ready_tasks.clear(); + delayed_tasks.clear(); delete this; }