diff options
| author | 2017-03-06 20:14:37 +0000 | |
|---|---|---|
| committer | 2017-03-06 20:14:37 +0000 | |
| commit | 4d7094dc998b4765cb73c6ec26e61a6cc0df030f (patch) | |
| tree | 8591e81826218bc34a1e2af492e0ebb3f32da2f6 /libs/hwui/renderthread | |
| parent | df2870df9ae6e5dbb7acfe3d5fd840a3317b0e66 (diff) | |
| parent | 1344c034c537f5335b44eae69715b07c1f94d555 (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.cpp | 4 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderTask.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderTask.h | 4 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 4 |
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) { |