From 4c1b646994a5878b792eaf6358756206d8fe1433 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Tue, 21 Dec 2021 10:30:50 -0800 Subject: SurfaceFlinger: Report stuck fences to client It's ocassionally observed in traces that the GPU is hung resulting in fences failing to fire. This normally propagates back up as an ANR in dequeueBuffers or onFrameAvailable. The ANR might then pass from the app team, to the HWUI team, to the WM team, and then if we are lucky enough to get a trace, to the GPU team. In this CL we allow the client process to monitor this situation itself, and proactively trigger an ANR with a more useful and informative message than "stuck in dequeueBuffers" Bug: 216160569 Test: Existing tests pass Change-Id: I3ff93bf57d24268ac57734dfed2df185985ffe1f --- libs/gui/SurfaceComposerClient.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'libs/gui/SurfaceComposerClient.cpp') diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 7a63af0ed3..4ce5e4fe59 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -447,6 +447,27 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } } +void TransactionCompletedListener::onTransactionQueueStalled() { + std::unordered_map> callbackCopy; + { + std::scoped_lock lock(mMutex); + callbackCopy = mQueueStallListeners; + } + for (auto const& it : callbackCopy) { + it.second(); + } +} + +void TransactionCompletedListener::addQueueStallListener(std::function stallListener, + void* id) { + std::scoped_lock lock(mMutex); + mQueueStallListeners[id] = stallListener; +} +void TransactionCompletedListener::removeQueueStallListener(void *id) { + std::scoped_lock lock(mMutex); + mQueueStallListeners.erase(id); +} + void TransactionCompletedListener::onReleaseBuffer(ReleaseCallbackId callbackId, sp releaseFence, uint32_t currentMaxAcquiredBufferCount) { -- cgit v1.2.3-59-g8ed1b