Fix threading issues
Bug: 25584167
Change-Id: I413ef9e0c86f7cca1f7d085e0071745ca0192853
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index a1107f0..15ccd6a 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -563,7 +563,10 @@
void* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {
void* retval;
task->setReturnPtr(&retval);
- mRenderThread.queueAndWait(task);
+ SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition);
+ AutoMutex _lock(mSyncMutex);
+ mRenderThread.queue(&syncTask);
+ mSyncCondition.wait(mSyncMutex);
return retval;
}
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index d0e601e..338fab6 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -117,6 +117,9 @@
DrawFrameTask mDrawFrameTask;
+ Mutex mSyncMutex;
+ Condition mSyncCondition;
+
void destroyContext();
void post(RenderTask* task);
diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp
index 526a848..9fb30c9 100644
--- a/libs/hwui/renderthread/RenderThread.cpp
+++ b/libs/hwui/renderthread/RenderThread.cpp
@@ -25,7 +25,9 @@
#include <gui/ISurfaceComposer.h>
#include <gui/SurfaceComposerClient.h>
#include <sys/resource.h>
+#include <utils/Condition.h>
#include <utils/Log.h>
+#include <utils/Mutex.h>
namespace android {
namespace uirenderer {
@@ -325,10 +327,16 @@
}
void RenderThread::queueAndWait(RenderTask* task) {
- SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition);
- AutoMutex _lock(mSyncMutex);
+ // These need to be local to the thread to avoid the Condition
+ // signaling the wrong thread. The easiest way to achieve that is to just
+ // make this on the stack, although that has a slight cost to it
+ Mutex mutex;
+ Condition condition;
+ SignalingRenderTask syncTask(task, &mutex, &condition);
+
+ AutoMutex _lock(mutex);
queue(&syncTask);
- mSyncCondition.wait(mSyncMutex);
+ condition.wait(mutex);
}
void RenderThread::queueAtFront(RenderTask* task) {
diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h
index d8c7e61..076e3d4 100644
--- a/libs/hwui/renderthread/RenderThread.h
+++ b/libs/hwui/renderthread/RenderThread.h
@@ -27,9 +27,7 @@
#include <utils/Looper.h>
#include <utils/Thread.h>
-#include <condition_variable>
#include <memory>
-#include <mutex>
#include <set>
namespace android {
@@ -127,8 +125,6 @@
nsecs_t mNextWakeup;
TaskQueue mQueue;
- Mutex mSyncMutex;
- Condition mSyncCondition;
DisplayInfo mDisplayInfo;