summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ady Abraham <adyabr@google.com> 2019-05-15 13:47:16 -0700
committer Ady Abraham <adyabr@google.com> 2019-05-15 20:48:07 +0000
commit90055aa05059865793474dc2c5719a18cdaa3175 (patch)
treeeb55de3a1236953c1c0c3f5da549481f38975ac2
parent3f8312b5dc975c391f85f90a4a0586ac3c7ac899 (diff)
FenceTimeline: Fix a potential race condition
FenceTimeline::updateSignalTimes checks if mQueue is empty without grabbing the lock. This can lead a situaltion that a threads calls pop() on an empty queue. Test: boot Bug: 132735340 Change-Id: I3007bfc1161797cb4d853506bb354e820bc9105d
-rw-r--r--libs/ui/FenceTime.cpp2
-rw-r--r--libs/ui/include/ui/FenceTime.h3
2 files changed, 3 insertions, 2 deletions
diff --git a/libs/ui/FenceTime.cpp b/libs/ui/FenceTime.cpp
index 340231d352..bdfe04b0dd 100644
--- a/libs/ui/FenceTime.cpp
+++ b/libs/ui/FenceTime.cpp
@@ -279,8 +279,8 @@ void FenceTimeline::push(const std::shared_ptr<FenceTime>& fence) {
}
void FenceTimeline::updateSignalTimes() {
+ std::lock_guard<std::mutex> lock(mMutex);
while (!mQueue.empty()) {
- std::lock_guard<std::mutex> lock(mMutex);
std::shared_ptr<FenceTime> fence = mQueue.front().lock();
if (!fence) {
// The shared_ptr no longer exists and no one cares about the
diff --git a/libs/ui/include/ui/FenceTime.h b/libs/ui/include/ui/FenceTime.h
index a5a1fcbde7..ecba7f73e8 100644
--- a/libs/ui/include/ui/FenceTime.h
+++ b/libs/ui/include/ui/FenceTime.h
@@ -19,6 +19,7 @@
#include <ui/Fence.h>
#include <utils/Flattenable.h>
+#include <utils/Mutex.h>
#include <utils/Timers.h>
#include <atomic>
@@ -159,7 +160,7 @@ public:
private:
mutable std::mutex mMutex;
- std::queue<std::weak_ptr<FenceTime>> mQueue;
+ std::queue<std::weak_ptr<FenceTime>> mQueue GUARDED_BY(mMutex);
};
// Used by test code to create or get FenceTimes for a given Fence.