Merge "Check for spurious wake ups"

am: 3a3cd0a27f

Change-Id: Ia445070278f5a80c85b48e06ddf614d462db45af
This commit is contained in:
Tom Cherry
2017-03-06 19:57:18 +00:00
committed by android-build-merger
4 changed files with 10 additions and 3 deletions

View File

@@ -685,7 +685,9 @@ void* RenderProxy::postAndWait(MethodInvokeRenderTask* task) {
SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition); SignalingRenderTask syncTask(task, &mSyncMutex, &mSyncCondition);
AutoMutex _lock(mSyncMutex); AutoMutex _lock(mSyncMutex);
mRenderThread.queue(&syncTask); mRenderThread.queue(&syncTask);
while (!syncTask.hasRun()) {
mSyncCondition.wait(mSyncMutex); mSyncCondition.wait(mSyncMutex);
}
return retval; return retval;
} }

View File

@@ -26,6 +26,7 @@ namespace renderthread {
void SignalingRenderTask::run() { void SignalingRenderTask::run() {
mTask->run(); mTask->run();
mLock->lock(); mLock->lock();
mHasRun = true;
mSignal->signal(); mSignal->signal();
mLock->unlock(); mLock->unlock();
} }

View File

@@ -60,13 +60,15 @@ class SignalingRenderTask : public RenderTask {
public: public:
// Takes ownership of task, caller owns lock and signal // Takes ownership of task, caller owns lock and signal
SignalingRenderTask(RenderTask* task, Mutex* lock, Condition* 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; virtual void run() override;
bool hasRun() const { return mHasRun; }
private: private:
RenderTask* mTask; RenderTask* mTask;
Mutex* mLock; Mutex* mLock;
Condition* mSignal; Condition* mSignal;
bool mHasRun;
}; };
typedef void* (*RunnableMethod)(void* data); typedef void* (*RunnableMethod)(void* data);

View File

@@ -345,8 +345,10 @@ void RenderThread::queueAndWait(RenderTask* task) {
AutoMutex _lock(mutex); AutoMutex _lock(mutex);
queue(&syncTask); queue(&syncTask);
while (!syncTask.hasRun()) {
condition.wait(mutex); condition.wait(mutex);
} }
}
void RenderThread::queueAtFront(RenderTask* task) { void RenderThread::queueAtFront(RenderTask* task) {
AutoMutex _lock(mLock); AutoMutex _lock(mLock);