Lock once in CallbackTaskManager::Flush()
This patch ensures there will only be one lock in
CallbackTaskManager::Flush() instead of two (in IsEmpty() and in
AcquireCallbackTasks()).
Bug: dawn:752
Change-Id: I3a33557fde65fcb414ee0a349d5518d0858ca762
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/151681
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/native/CallbackTaskManager.cpp b/src/dawn/native/CallbackTaskManager.cpp
index ea72b96..7da85c2 100644
--- a/src/dawn/native/CallbackTaskManager.cpp
+++ b/src/dawn/native/CallbackTaskManager.cpp
@@ -71,14 +71,6 @@
return mCallbackTaskQueue.empty();
}
-std::vector<std::unique_ptr<CallbackTask>> CallbackTaskManager::AcquireCallbackTasks() {
- std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);
-
- std::vector<std::unique_ptr<CallbackTask>> allTasks;
- allTasks.swap(mCallbackTaskQueue);
- return allTasks;
-}
-
void CallbackTaskManager::AddCallbackTask(std::unique_ptr<CallbackTask> callbackTask) {
std::lock_guard<std::mutex> lock(mCallbackTaskQueueMutex);
mCallbackTaskQueue.push_back(std::move(callbackTask));
@@ -103,15 +95,21 @@
}
void CallbackTaskManager::Flush() {
- if (!IsEmpty()) {
- // If a user calls Queue::Submit inside the callback, then the device will be ticked,
- // which in turns ticks the tracker, causing reentrance and dead lock here. To prevent
- // such reentrant call, we remove all the callback tasks from mCallbackTaskManager,
- // update mCallbackTaskManager, then call all the callbacks.
- auto callbackTasks = AcquireCallbackTasks();
- for (std::unique_ptr<CallbackTask>& callbackTask : callbackTasks) {
- callbackTask->Execute();
- }
+ std::unique_lock<std::mutex> lock(mCallbackTaskQueueMutex);
+ if (mCallbackTaskQueue.empty()) {
+ return;
+ }
+
+ // If a user calls Queue::Submit inside the callback, then the device will be ticked,
+ // which in turns ticks the tracker, causing reentrance and dead lock here. To prevent
+ // such reentrant call, we remove all the callback tasks from mCallbackTaskManager,
+ // update mCallbackTaskManager, then call all the callbacks.
+ std::vector<std::unique_ptr<CallbackTask>> allTasks;
+ allTasks.swap(mCallbackTaskQueue);
+ lock.unlock();
+
+ for (std::unique_ptr<CallbackTask>& callbackTask : allTasks) {
+ callbackTask->Execute();
}
}
diff --git a/src/dawn/native/CallbackTaskManager.h b/src/dawn/native/CallbackTaskManager.h
index 3cf0091..06211be 100644
--- a/src/dawn/native/CallbackTaskManager.h
+++ b/src/dawn/native/CallbackTaskManager.h
@@ -67,8 +67,6 @@
void Flush();
private:
- std::vector<std::unique_ptr<CallbackTask>> AcquireCallbackTasks();
-
std::mutex mCallbackTaskQueueMutex;
std::vector<std::unique_ptr<CallbackTask>> mCallbackTaskQueue;
};