Fix threading issues

Bug: 25584167
Change-Id: I413ef9e0c86f7cca1f7d085e0071745ca0192853
This commit is contained in:
John Reck
2015-11-10 12:52:44 -08:00
parent 8382f98f62
commit cba287b971
4 changed files with 18 additions and 8 deletions

View File

@@ -563,7 +563,10 @@ void RenderProxy::post(RenderTask* task) {
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;
}

View File

@@ -117,6 +117,9 @@ private:
DrawFrameTask mDrawFrameTask;
Mutex mSyncMutex;
Condition mSyncCondition;
void destroyContext();
void post(RenderTask* task);

View File

@@ -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::queue(RenderTask* task) {
}
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) {

View File

@@ -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 @@ private:
nsecs_t mNextWakeup;
TaskQueue mQueue;
Mutex mSyncMutex;
Condition mSyncCondition;
DisplayInfo mDisplayInfo;