Loading libs/gui/SurfaceComposerClient.cpp +13 −9 Original line number Diff line number Diff line Loading @@ -210,13 +210,13 @@ void TransactionCompletedListener::removeReleaseBufferCallback(uint64_t graphicB void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie, sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) { std::lock_guard<std::mutex> lock(mMutex); std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); mSurfaceStatsListeners.insert({surfaceControl->getHandle(), SurfaceStatsCallbackEntry(context, cookie, listener)}); } void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) { std::lock_guard<std::mutex> lock(mMutex); std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) { auto [itContext, itCookie, itListener] = it->second; if (itContext == context && itCookie == cookie) { Loading @@ -242,7 +242,6 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> surfaceListeners; { std::lock_guard<std::mutex> lock(mMutex); Loading @@ -258,7 +257,6 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener * sp<SurfaceControl> that could possibly exist for the callbacks. */ callbacksMap = mCallbacks; surfaceListeners = mSurfaceStatsListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); Loading Loading @@ -339,12 +337,18 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener surfaceControlStats); } for (const auto& surfaceStats : transactionStats.surfaceStats) { auto listenerRange = surfaceListeners.equal_range(surfaceStats.surfaceControl); { // Acquire surface stats listener lock such that we guarantee that after calling // unregister, there won't be any further callback. std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); auto listenerRange = mSurfaceStatsListeners.equal_range( surfaceStats.surfaceControl); for (auto it = listenerRange.first; it != listenerRange.second; it++) { auto entry = it->second; entry.callback(entry.context, transactionStats.latchTime, transactionStats.presentFence, surfaceStats); } } if (surfaceStats.jankData.empty()) continue; Loading libs/gui/include/gui/SurfaceComposerClient.h +7 −2 Original line number Diff line number Diff line Loading @@ -655,6 +655,9 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { // This lock needs to be recursive so we can unregister a callback from within that callback. std::recursive_mutex mJankListenerMutex; // This lock needs to be recursive so we can unregister a callback from within that callback. std::recursive_mutex mSurfaceStatsListenerMutex; bool mListening GUARDED_BY(mMutex) = false; int64_t mCallbackIdCounter GUARDED_BY(mMutex) = 1; Loading Loading @@ -683,8 +686,10 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners; std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback> mReleaseBufferCallbacks GUARDED_BY(mMutex); std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> mSurfaceStatsListeners GUARDED_BY(mMutex); // This is protected by mSurfaceStatsListenerMutex, but GUARDED_BY isn't supported for // std::recursive_mutex std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> mSurfaceStatsListeners; public: static sp<TransactionCompletedListener> getInstance(); Loading Loading
libs/gui/SurfaceComposerClient.cpp +13 −9 Original line number Diff line number Diff line Loading @@ -210,13 +210,13 @@ void TransactionCompletedListener::removeReleaseBufferCallback(uint64_t graphicB void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie, sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) { std::lock_guard<std::mutex> lock(mMutex); std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); mSurfaceStatsListeners.insert({surfaceControl->getHandle(), SurfaceStatsCallbackEntry(context, cookie, listener)}); } void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) { std::lock_guard<std::mutex> lock(mMutex); std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) { auto [itContext, itCookie, itListener] = it->second; if (itContext == context && itCookie == cookie) { Loading @@ -242,7 +242,6 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> surfaceListeners; { std::lock_guard<std::mutex> lock(mMutex); Loading @@ -258,7 +257,6 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener * sp<SurfaceControl> that could possibly exist for the callbacks. */ callbacksMap = mCallbacks; surfaceListeners = mSurfaceStatsListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); Loading Loading @@ -339,12 +337,18 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener surfaceControlStats); } for (const auto& surfaceStats : transactionStats.surfaceStats) { auto listenerRange = surfaceListeners.equal_range(surfaceStats.surfaceControl); { // Acquire surface stats listener lock such that we guarantee that after calling // unregister, there won't be any further callback. std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex); auto listenerRange = mSurfaceStatsListeners.equal_range( surfaceStats.surfaceControl); for (auto it = listenerRange.first; it != listenerRange.second; it++) { auto entry = it->second; entry.callback(entry.context, transactionStats.latchTime, transactionStats.presentFence, surfaceStats); } } if (surfaceStats.jankData.empty()) continue; Loading
libs/gui/include/gui/SurfaceComposerClient.h +7 −2 Original line number Diff line number Diff line Loading @@ -655,6 +655,9 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { // This lock needs to be recursive so we can unregister a callback from within that callback. std::recursive_mutex mJankListenerMutex; // This lock needs to be recursive so we can unregister a callback from within that callback. std::recursive_mutex mSurfaceStatsListenerMutex; bool mListening GUARDED_BY(mMutex) = false; int64_t mCallbackIdCounter GUARDED_BY(mMutex) = 1; Loading Loading @@ -683,8 +686,10 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners; std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback> mReleaseBufferCallbacks GUARDED_BY(mMutex); std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> mSurfaceStatsListeners GUARDED_BY(mMutex); // This is protected by mSurfaceStatsListenerMutex, but GUARDED_BY isn't supported for // std::recursive_mutex std::multimap<sp<IBinder>, SurfaceStatsCallbackEntry> mSurfaceStatsListeners; public: static sp<TransactionCompletedListener> getInstance(); Loading