void EventLoop::Impl::processTasks() { TaskQueue tq; std::unique_lock<LockType> ul(task_mutex_); task_queue_.swap(tq); while (auto node = tq.front_node()) { tq.pop_front(); auto &task_slot = node->element(); task_slot.state = TaskSlot::State::RUNNING; ul.unlock(); {// execute the task LockGuard g(task_run_mutex_); if (task_slot.state != TaskSlot::State::INACTIVE) { task_slot(); task_slot.state = TaskSlot::State::INACTIVE; } } ul.lock(); if (task_slot.token) { task_slot.token->removeTaskNode(node); } } }