summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread
diff options
context:
space:
mode:
author Tom Cherry <tomcherry@google.com> 2017-03-06 20:14:37 +0000
committer android-build-merger <android-build-merger@google.com> 2017-03-06 20:14:37 +0000
commit4d7094dc998b4765cb73c6ec26e61a6cc0df030f (patch)
tree8591e81826218bc34a1e2af492e0ebb3f32da2f6 /libs/hwui/renderthread
parentdf2870df9ae6e5dbb7acfe3d5fd840a3317b0e66 (diff)
parent1344c034c537f5335b44eae69715b07c1f94d555 (diff)
Merge "Check for spurious wake ups" am: 3a3cd0a27f am: c2dcebe6e6
am: 1344c034c5 Change-Id: I8ffc749ab6fbd825ce238fff4ba1d12609585c04
Diffstat (limited to 'libs/hwui/renderthread')
-rw-r--r--libs/hwui/renderthread/RenderProxy.cpp4
-rw-r--r--libs/hwui/renderthread/RenderTask.cpp1
-rw-r--r--libs/hwui/renderthread/RenderTask.h4
-rw-r--r--libs/hwui/renderthread/RenderThread.cpp4
4 files changed, 10 insertions, 3 deletions
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index f4a4773b2937..a1f1717e6b96 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -703,7 +703,9 @@ void* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {
SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition);
AutoMutex _lock(mSyncMutex);
mRenderThread.queue(&syncTask);
- mSyncCondition.wait(mSyncMutex);
+ while (!syncTask.hasRun()) {
+ mSyncCondition.wait(mSyncMutex);
+ }
return retval;
}
diff --git a/libs/hwui/renderthread/RenderTask.cpp b/libs/hwui/renderthread/RenderTask.cpp
index b14f580791c5..928a4ef7fb53 100644
--- a/libs/hwui/renderthread/RenderTask.cpp
+++ b/libs/hwui/renderthread/RenderTask.cpp
@@ -26,6 +26,7 @@ namespace renderthread {
void SignalingRenderTask::run() {
mTask->run();
mLock->lock();
+ mHasRun = true;
mSignal->signal();
mLock->unlock();
}
diff --git a/libs/hwui/renderthread/RenderTask.h b/libs/hwui/renderthread/RenderTask.h
index 9ea671be5b86..a7acf91cbdb1 100644
--- a/libs/hwui/renderthread/RenderTask.h
+++ b/libs/hwui/renderthread/RenderTask.h
@@ -60,13 +60,15 @@ class SignalingRenderTask : public RenderTask {
public:
// Takes ownership of task, caller owns lock and signal
SignalingRenderTask(RenderTask* task, Mutex* lock, Condition* signal)
- : mTask(task), mLock(lock), mSignal(signal) {}
+ : mTask(task), mLock(lock), mSignal(signal), mHasRun(false) {}
virtual void run() override;
+ bool hasRun() const { return mHasRun; }
private:
RenderTask* mTask;
Mutex* mLock;
Condition* mSignal;
+ bool mHasRun;
};
typedef void* (*RunnableMethod)(void* data);
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index e13d0ce6d688..e32fd63e1125 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -374,7 +374,9 @@ void RenderThread::queueAndWait(RenderTask* task) {
AutoMutex _lock(mutex);
queue(&syncTask);
- condition.wait(mutex);
+ while (!syncTask.hasRun()) {
+ condition.wait(mutex);
+ }
}
void RenderThread::queueAtFront(RenderTask* task) {