Loading libs/gui/BLASTBufferQueue.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -167,14 +167,15 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati mNumFrameAvailable = 0; TransactionCompletedListener::getInstance()->addQueueStallListener( [&]() { std::function<void(bool)> callbackCopy; [&](const std::string& reason) { std::function<void(const std::string&)> callbackCopy; { std::unique_lock _lock{mMutex}; callbackCopy = mTransactionHangCallback; } if (callbackCopy) callbackCopy(true); }, this); if (callbackCopy) callbackCopy(reason); }, this); BQA_LOGV("BLASTBufferQueue created"); } Loading Loading @@ -1114,7 +1115,8 @@ bool BLASTBufferQueue::isSameSurfaceControl(const sp<SurfaceControl>& surfaceCon return SurfaceControl::isSameSurface(mSurfaceControl, surfaceControl); } void BLASTBufferQueue::setTransactionHangCallback(std::function<void(bool)> callback) { void BLASTBufferQueue::setTransactionHangCallback( std::function<void(const std::string&)> callback) { std::unique_lock _lock{mMutex}; mTransactionHangCallback = callback; } Loading libs/gui/ITransactionCompletedListener.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -290,15 +290,17 @@ public: void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, uint32_t currentMaxAcquiredBufferCount) override { callRemoteAsync<decltype( &ITransactionCompletedListener::onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId, releaseFence, callRemoteAsync<decltype(&ITransactionCompletedListener:: onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId, releaseFence, currentMaxAcquiredBufferCount); } void onTransactionQueueStalled() override { callRemoteAsync<decltype(&ITransactionCompletedListener::onTransactionQueueStalled)>( Tag::ON_TRANSACTION_QUEUE_STALLED); void onTransactionQueueStalled(const String8& reason) override { callRemoteAsync< decltype(&ITransactionCompletedListener:: onTransactionQueueStalled)>(Tag::ON_TRANSACTION_QUEUE_STALLED, reason); } }; Loading libs/gui/SurfaceComposerClient.cpp +15 −14 Original line number Diff line number Diff line Loading @@ -456,22 +456,23 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } } void TransactionCompletedListener::onTransactionQueueStalled() { std::unordered_map<void*, std::function<void()>> callbackCopy; void TransactionCompletedListener::onTransactionQueueStalled(const String8& reason) { std::unordered_map<void*, std::function<void(const std::string&)>> callbackCopy; { std::scoped_lock<std::mutex> lock(mMutex); callbackCopy = mQueueStallListeners; } for (auto const& it : callbackCopy) { it.second(); it.second(reason.c_str()); } } void TransactionCompletedListener::addQueueStallListener(std::function<void()> stallListener, void* id) { void TransactionCompletedListener::addQueueStallListener( std::function<void(const std::string&)> stallListener, void* id) { std::scoped_lock<std::mutex> lock(mMutex); mQueueStallListeners[id] = stallListener; } void TransactionCompletedListener::removeQueueStallListener(void* id) { std::scoped_lock<std::mutex> lock(mMutex); mQueueStallListeners.erase(id); Loading libs/gui/include/gui/BLASTBufferQueue.h +4 −6 Original line number Diff line number Diff line Loading @@ -113,12 +113,10 @@ public: uint64_t getLastAcquiredFrameNum(); /** * Set a callback to be invoked when we are hung. The boolean parameter * indicates whether the hang is due to an unfired fence. * TODO: The boolean is always true atm, unfired fence is * the only case we detect. * Set a callback to be invoked when we are hung. The string parameter * indicates the reason for the hang. */ void setTransactionHangCallback(std::function<void(bool)> callback); void setTransactionHangCallback(std::function<void(const std::string&)> callback); virtual ~BLASTBufferQueue(); Loading Loading @@ -282,7 +280,7 @@ private: bool mAppliedLastTransaction = false; uint64_t mLastAppliedFrameNumber = 0; std::function<void(bool)> mTransactionHangCallback; std::function<void(const std::string&)> mTransactionHangCallback; std::unordered_set<uint64_t> mSyncedFrameNumbers GUARDED_BY(mMutex); }; Loading libs/gui/include/gui/ITransactionCompletedListener.h +2 −1 Original line number Diff line number Diff line Loading @@ -194,7 +194,8 @@ public: virtual void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, uint32_t currentMaxAcquiredBufferCount) = 0; virtual void onTransactionQueueStalled() = 0; virtual void onTransactionQueueStalled(const String8& name) = 0; }; class BnTransactionCompletedListener : public SafeBnInterface<ITransactionCompletedListener> { Loading Loading
libs/gui/BLASTBufferQueue.cpp +11 −9 Original line number Diff line number Diff line Loading @@ -167,14 +167,15 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati mNumFrameAvailable = 0; TransactionCompletedListener::getInstance()->addQueueStallListener( [&]() { std::function<void(bool)> callbackCopy; [&](const std::string& reason) { std::function<void(const std::string&)> callbackCopy; { std::unique_lock _lock{mMutex}; callbackCopy = mTransactionHangCallback; } if (callbackCopy) callbackCopy(true); }, this); if (callbackCopy) callbackCopy(reason); }, this); BQA_LOGV("BLASTBufferQueue created"); } Loading Loading @@ -1114,7 +1115,8 @@ bool BLASTBufferQueue::isSameSurfaceControl(const sp<SurfaceControl>& surfaceCon return SurfaceControl::isSameSurface(mSurfaceControl, surfaceControl); } void BLASTBufferQueue::setTransactionHangCallback(std::function<void(bool)> callback) { void BLASTBufferQueue::setTransactionHangCallback( std::function<void(const std::string&)> callback) { std::unique_lock _lock{mMutex}; mTransactionHangCallback = callback; } Loading
libs/gui/ITransactionCompletedListener.cpp +9 −7 Original line number Diff line number Diff line Loading @@ -290,15 +290,17 @@ public: void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, uint32_t currentMaxAcquiredBufferCount) override { callRemoteAsync<decltype( &ITransactionCompletedListener::onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId, releaseFence, callRemoteAsync<decltype(&ITransactionCompletedListener:: onReleaseBuffer)>(Tag::ON_RELEASE_BUFFER, callbackId, releaseFence, currentMaxAcquiredBufferCount); } void onTransactionQueueStalled() override { callRemoteAsync<decltype(&ITransactionCompletedListener::onTransactionQueueStalled)>( Tag::ON_TRANSACTION_QUEUE_STALLED); void onTransactionQueueStalled(const String8& reason) override { callRemoteAsync< decltype(&ITransactionCompletedListener:: onTransactionQueueStalled)>(Tag::ON_TRANSACTION_QUEUE_STALLED, reason); } }; Loading
libs/gui/SurfaceComposerClient.cpp +15 −14 Original line number Diff line number Diff line Loading @@ -456,22 +456,23 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } } void TransactionCompletedListener::onTransactionQueueStalled() { std::unordered_map<void*, std::function<void()>> callbackCopy; void TransactionCompletedListener::onTransactionQueueStalled(const String8& reason) { std::unordered_map<void*, std::function<void(const std::string&)>> callbackCopy; { std::scoped_lock<std::mutex> lock(mMutex); callbackCopy = mQueueStallListeners; } for (auto const& it : callbackCopy) { it.second(); it.second(reason.c_str()); } } void TransactionCompletedListener::addQueueStallListener(std::function<void()> stallListener, void* id) { void TransactionCompletedListener::addQueueStallListener( std::function<void(const std::string&)> stallListener, void* id) { std::scoped_lock<std::mutex> lock(mMutex); mQueueStallListeners[id] = stallListener; } void TransactionCompletedListener::removeQueueStallListener(void* id) { std::scoped_lock<std::mutex> lock(mMutex); mQueueStallListeners.erase(id); Loading
libs/gui/include/gui/BLASTBufferQueue.h +4 −6 Original line number Diff line number Diff line Loading @@ -113,12 +113,10 @@ public: uint64_t getLastAcquiredFrameNum(); /** * Set a callback to be invoked when we are hung. The boolean parameter * indicates whether the hang is due to an unfired fence. * TODO: The boolean is always true atm, unfired fence is * the only case we detect. * Set a callback to be invoked when we are hung. The string parameter * indicates the reason for the hang. */ void setTransactionHangCallback(std::function<void(bool)> callback); void setTransactionHangCallback(std::function<void(const std::string&)> callback); virtual ~BLASTBufferQueue(); Loading Loading @@ -282,7 +280,7 @@ private: bool mAppliedLastTransaction = false; uint64_t mLastAppliedFrameNumber = 0; std::function<void(bool)> mTransactionHangCallback; std::function<void(const std::string&)> mTransactionHangCallback; std::unordered_set<uint64_t> mSyncedFrameNumbers GUARDED_BY(mMutex); }; Loading
libs/gui/include/gui/ITransactionCompletedListener.h +2 −1 Original line number Diff line number Diff line Loading @@ -194,7 +194,8 @@ public: virtual void onReleaseBuffer(ReleaseCallbackId callbackId, sp<Fence> releaseFence, uint32_t currentMaxAcquiredBufferCount) = 0; virtual void onTransactionQueueStalled() = 0; virtual void onTransactionQueueStalled(const String8& name) = 0; }; class BnTransactionCompletedListener : public SafeBnInterface<ITransactionCompletedListener> { Loading