Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea953ceb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Revert "Ensure reportFrameMetrics not being called on deleted...

Merge "Revert "Ensure reportFrameMetrics not being called on deleted instance"" into sc-dev am: 8810677c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15080430

Change-Id: I704d357d3ae21800eb43f7eb165af1968a619822
parents 34fb2f38 8810677c
Loading
Loading
Loading
Loading
+5 −8
Original line number Original line Diff line number Diff line
@@ -182,12 +182,12 @@ CallbackId TransactionCompletedListener::addCallbackFunction(


void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
void TransactionCompletedListener::addJankListener(const sp<JankDataListener>& listener,
                                                   sp<SurfaceControl> surfaceControl) {
                                                   sp<SurfaceControl> surfaceControl) {
    std::scoped_lock<std::recursive_mutex> lock(mJankListenerMutex);
    std::lock_guard<std::mutex> lock(mMutex);
    mJankListeners.insert({surfaceControl->getHandle(), listener});
    mJankListeners.insert({surfaceControl->getHandle(), listener});
}
}


void TransactionCompletedListener::removeJankListener(const sp<JankDataListener>& 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();) {
    for (auto it = mJankListeners.begin(); it != mJankListeners.end();) {
        if (it->second == listener) {
        if (it->second == listener) {
            it = mJankListeners.erase(it);
            it = mJankListeners.erase(it);
@@ -242,6 +242,7 @@ void TransactionCompletedListener::addSurfaceControlToCallbacks(


void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
void TransactionCompletedListener::onTransactionCompleted(ListenerStats listenerStats) {
    std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap;
    std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> callbacksMap;
    std::multimap<sp<IBinder>, sp<JankDataListener>> jankListenersMap;
    {
    {
        std::lock_guard<std::mutex> lock(mMutex);
        std::lock_guard<std::mutex> lock(mMutex);


@@ -257,6 +258,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener
         * sp<SurfaceControl> that could possibly exist for the callbacks.
         * sp<SurfaceControl> that could possibly exist for the callbacks.
         */
         */
        callbacksMap = mCallbacks;
        callbacksMap = mCallbacks;
        jankListenersMap = mJankListeners;
        for (const auto& transactionStats : listenerStats.transactionStats) {
        for (const auto& transactionStats : listenerStats.transactionStats) {
            for (auto& callbackId : transactionStats.callbackIds) {
            for (auto& callbackId : transactionStats.callbackIds) {
                mCallbacks.erase(callbackId);
                mCallbacks.erase(callbackId);
@@ -352,12 +354,7 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener
            }
            }


            if (surfaceStats.jankData.empty()) continue;
            if (surfaceStats.jankData.empty()) continue;

            auto jankRange = jankListenersMap.equal_range(surfaceStats.surfaceControl);
            // 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);
            for (auto it = jankRange.first; it != jankRange.second; it++) {
            for (auto it = jankRange.first; it != jankRange.second; it++) {
                it->second->onJankDataAvailable(surfaceStats.jankData);
                it->second->onJankDataAvailable(surfaceStats.jankData);
            }
            }
+1 −7
Original line number Original line Diff line number Diff line
@@ -652,9 +652,6 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {


    std::mutex mMutex;
    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.
    // This lock needs to be recursive so we can unregister a callback from within that callback.
    std::recursive_mutex mSurfaceStatsListenerMutex;
    std::recursive_mutex mSurfaceStatsListenerMutex;


@@ -680,10 +677,7 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {


    std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> mCallbacks
    std::unordered_map<CallbackId, CallbackTranslation, CallbackIdHash> mCallbacks
            GUARDED_BY(mMutex);
            GUARDED_BY(mMutex);

    std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners 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::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback>
    std::unordered_map<uint64_t /* graphicsBufferId */, ReleaseBufferCallback>
            mReleaseBufferCallbacks GUARDED_BY(mMutex);
            mReleaseBufferCallbacks GUARDED_BY(mMutex);