diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/SurfaceFlinger.cpp index 9694cf1f20fd3..965b7dd28f320 100644 --- a/libs/surfaceflinger/SurfaceFlinger.cpp +++ b/libs/surfaceflinger/SurfaceFlinger.cpp @@ -417,9 +417,9 @@ void SurfaceFlinger::waitForEvent() { while (true) { nsecs_t timeout = -1; + const nsecs_t freezeDisplayTimeout = ms2ns(5000); if (UNLIKELY(isFrozen())) { // wait 5 seconds - const nsecs_t freezeDisplayTimeout = ms2ns(5000); const nsecs_t now = systemTime(); if (mFreezeDisplayTime == 0) { mFreezeDisplayTime = now; @@ -429,23 +429,27 @@ void SurfaceFlinger::waitForEvent() } MessageList::value_type msg = mEventQueue.waitMessage(timeout); + + // see if we timed out + if (isFrozen()) { + const nsecs_t now = systemTime(); + nsecs_t frozenTime = (now - mFreezeDisplayTime); + if (frozenTime >= freezeDisplayTimeout) { + // we timed out and are still frozen + LOGW("timeout expired mFreezeDisplay=%d, mFreezeCount=%d", + mFreezeDisplay, mFreezeCount); + mFreezeDisplayTime = 0; + mFreezeCount = 0; + mFreezeDisplay = false; + } + } + if (msg != 0) { - mFreezeDisplayTime = 0; switch (msg->what) { case MessageQueue::INVALIDATE: // invalidate message, just return to the main loop return; } - } else { - // we timed out - if (isFrozen()) { - // we timed out and are still frozen - LOGW("timeout expired mFreezeDisplay=%d, mFreezeCount=%d", - mFreezeDisplay, mFreezeCount); - mFreezeCount = 0; - mFreezeDisplay = false; - return; - } } } } @@ -1646,6 +1650,7 @@ status_t SurfaceFlinger::onTransact( } case 1007: // set mFreezeCount mFreezeCount = data.readInt32(); + mFreezeDisplayTime = 0; return NO_ERROR; case 1010: // interrogate. reply->writeInt32(0); diff --git a/libs/surfaceflinger/SurfaceFlinger.h b/libs/surfaceflinger/SurfaceFlinger.h index f9bfe6c7c3016..c0ab73d891228 100644 --- a/libs/surfaceflinger/SurfaceFlinger.h +++ b/libs/surfaceflinger/SurfaceFlinger.h @@ -291,7 +291,11 @@ private: friend class FreezeLock; sp getFreezeLock() const; - inline void incFreezeCount() { mFreezeCount++; } + inline void incFreezeCount() { + if (mFreezeCount == 0) + mFreezeDisplayTime = 0; + mFreezeCount++; + } inline void decFreezeCount() { if (mFreezeCount > 0) mFreezeCount--; } inline bool hasFreezeRequest() const { return mFreezeDisplay; } inline bool isFrozen() const {