diff --git a/src/manager.cpp b/src/manager.cpp index 91d1b745616f27075c1da59aacb67d9898b06f41..bb863b7171a2f01b9c79b10de92eb3074ed82f5c 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -1355,14 +1355,14 @@ Manager::removeAudio(Call& call) getRingBufferPool().unBindAll(call_id); } -// Not thread-safe, SHOULD be called in same thread that run poolEvents() +// Not thread-safe, SHOULD be called in same thread that run pollEvents() void Manager::registerEventHandler(uintptr_t handlerId, EventHandler handler) { eventHandlerMap_[handlerId] = handler; } -// Not thread-safe, SHOULD be called in same thread that run poolEvents() +// Not thread-safe, SHOULD be called in same thread that run pollEvents() void Manager::unregisterEventHandler(uintptr_t handlerId) { @@ -1375,10 +1375,10 @@ Manager::unregisterEventHandler(uintptr_t handlerId) } } -// Not thread-safe, SHOULD be called in same thread that run poolEvents() void Manager::addTask(const std::function<bool()>&& task) { + std::lock_guard<std::mutex> lock(scheduledTasksMutex_); pendingTaskList_.emplace_back(std::move(task)); } @@ -1441,8 +1441,11 @@ void Manager::pollEvents() //-- Tasks { - auto tmpList = std::move(pendingTaskList_); - pendingTaskList_.clear(); + decltype(pendingTaskList_) tmpList; + { + std::lock_guard<std::mutex> lock(scheduledTasksMutex_); + std::swap(pendingTaskList_, tmpList); + } auto iter = std::begin(tmpList); while (iter != tmpList.cend()) { if (finished_) @@ -1460,7 +1463,10 @@ void Manager::pollEvents() tmpList.erase(iter); iter = next; } - pendingTaskList_.splice(std::end(pendingTaskList_), tmpList); + { + std::lock_guard<std::mutex> lock(scheduledTasksMutex_); + pendingTaskList_.splice(std::end(pendingTaskList_), tmpList); + } } }