Loading libs/gui/SurfaceComposerClient.cpp +5 −8 Original line number Diff line number Diff line Loading @@ -182,12 +182,12 @@ CallbackId TransactionCompletedListener::addCallbackFunction( void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener, sp<SurfaceControl> surfaceControl) { std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); std::lock_guard<std::mutex> lock(mMutex); mJankListeners.insert({surfaceControl->getHandle(), listener}); } void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) { std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); std::lock_guard<std::mutex> lock(mMutex); for (auto it = mJankListeners.begin(); it != mJankListeners.end();) { if (it->second == listener) { it = mJankListeners.erase(it); Loading Loading @@ -242,6 +242,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap; { std::lock_guard<std::mutex> lock(mMutex); Loading @@ -257,6 +258,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener * sp<SurfaceControl> that could possibly exist for the callbacks. */ callbacksMap = mCallbacks; jankListenersMap = mJankListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); Loading Loading @@ -352,12 +354,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } if (surfaceStats.jankData.empty()) continue; // Acquire jank listener lock such that we guarantee that after calling unregister, // there won't be any further callback. std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); auto copy = mJankListeners; auto jankRange = copy.equal_range(surfaceStats.surfaceControl); auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl); for (auto it = jankRange.first; it != jankRange.second; it++) { it->second->onJankDataAvailable(surfaceStats.jankData); } Loading libs/gui/include/gui/SurfaceComposerClient.h +1 −7 Original line number Diff line number Diff line Loading @@ -652,9 +652,6 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::mutex mMutex; // 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; Loading @@ -680,10 +677,7 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> mCallbacks GUARDED_BY(mMutex); // This is protected by mJankListenerMutex, but GUARDED_BY isn't supported for // std::recursive_mutex std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners; std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners GUARDED_BY(mMutex); std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback> mReleaseBufferCallbacks GUARDED_BY(mMutex); Loading Loading
libs/gui/SurfaceComposerClient.cpp +5 −8 Original line number Diff line number Diff line Loading @@ -182,12 +182,12 @@ CallbackId TransactionCompletedListener::addCallbackFunction( void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener, sp<SurfaceControl> surfaceControl) { std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); std::lock_guard<std::mutex> lock(mMutex); mJankListeners.insert({surfaceControl->getHandle(), listener}); } void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& listener) { std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); std::lock_guard<std::mutex> lock(mMutex); for (auto it = mJankListeners.begin(); it != mJankListeners.end();) { if (it->second == listener) { it = mJankListeners.erase(it); Loading Loading @@ -242,6 +242,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks( void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap; std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap; { std::lock_guard<std::mutex> lock(mMutex); Loading @@ -257,6 +258,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener * sp<SurfaceControl> that could possibly exist for the callbacks. */ callbacksMap = mCallbacks; jankListenersMap = mJankListeners; for (const auto& transactionStats : listenerStats.transactionStats) { for (auto& callbackId : transactionStats.callbackIds) { mCallbacks.erase(callbackId); Loading Loading @@ -352,12 +354,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } if (surfaceStats.jankData.empty()) continue; // Acquire jank listener lock such that we guarantee that after calling unregister, // there won't be any further callback. std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex); auto copy = mJankListeners; auto jankRange = copy.equal_range(surfaceStats.surfaceControl); auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl); for (auto it = jankRange.first; it != jankRange.second; it++) { it->second->onJankDataAvailable(surfaceStats.jankData); } Loading
libs/gui/include/gui/SurfaceComposerClient.h +1 −7 Original line number Diff line number Diff line Loading @@ -652,9 +652,6 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::mutex mMutex; // 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; Loading @@ -680,10 +677,7 @@ class TransactionCompletedListener : public BnTransactionCompletedListener { std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> mCallbacks GUARDED_BY(mMutex); // This is protected by mJankListenerMutex, but GUARDED_BY isn't supported for // std::recursive_mutex std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners; std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners GUARDED_BY(mMutex); std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback> mReleaseBufferCallbacks GUARDED_BY(mMutex); Loading