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

Commit c92fbf07 authored by Jorim Jaggi's avatar Jorim Jaggi Committed by Automerger Merge Worker
Browse files

Merge "Ensure reportFrameMetrics not being called on deleted instance" into sc-dev am: 603a15d2

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

Change-Id: Ifed2e4653fc08aad5ca875b835498be023e00c3d
parents 58ac45d9 603a15d2
Loading
Loading
Loading
Loading
+13 −9
Original line number Original line Diff line number Diff line
@@ -210,13 +210,13 @@ void TransactionCompletedListener::removeReleaseBufferCallback(uint64_t graphicB


void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
void TransactionCompletedListener::addSurfaceStatsListener(void* context, void* cookie,
        sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
        sp<SurfaceControl> surfaceControl, SurfaceStatsCallback listener) {
    std::lock_guard<std::mutex> lock(mMutex);
    std::scoped_lock<std::recursive_mutex> lock(mSurfaceStatsListenerMutex);
    mSurfaceStatsListeners.insert({surfaceControl->getHandle(),
    mSurfaceStatsListeners.insert({surfaceControl->getHandle(),
            SurfaceStatsCallbackEntry(context, cookie, listener)});
            SurfaceStatsCallbackEntry(context, cookie, listener)});
}
}


void TransactionCompletedListener::removeSurfaceStatsListener(void* context, void* cookie) {
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();) {
    for (auto it = mSurfaceStatsListeners.begin(); it != mSurfaceStatsListeners.end();) {
        auto [itContext, itCookie, itListener] = it->second;
        auto [itContext, itCookie, itListener] = it->second;
        if (itContext == context && itCookie == cookie) {
        if (itContext == context && itCookie == cookie) {
@@ -242,7 +242,6 @@ 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>, SurfaceStatsCallbackEntry> surfaceListeners;
    {
    {
        std::lock_guard<std::mutex> lock(mMutex);
        std::lock_guard<std::mutex> lock(mMutex);


@@ -258,7 +257,6 @@ 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;
        surfaceListeners = mSurfaceStatsListeners;
        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);
@@ -339,12 +337,18 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener
                             surfaceControlStats);
                             surfaceControlStats);
        }
        }
        for (const auto& surfaceStats : transactionStats.surfaceStats) {
        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++) {
                for (auto it = listenerRange.first; it != listenerRange.second; it++) {
                    auto entry = it->second;
                    auto entry = it->second;
                    entry.callback(entry.context, transactionStats.latchTime,
                    entry.callback(entry.context, transactionStats.latchTime,
                        transactionStats.presentFence, surfaceStats);
                        transactionStats.presentFence, surfaceStats);
                }
                }
            }


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


+7 −2
Original line number Original line Diff line number Diff line
@@ -657,6 +657,9 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {
    // 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 mJankListenerMutex;
    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;
    bool mListening GUARDED_BY(mMutex) = false;


    int64_t mCallbackIdCounter GUARDED_BY(mMutex) = 1;
    int64_t mCallbackIdCounter GUARDED_BY(mMutex) = 1;
@@ -685,8 +688,10 @@ class TransactionCompletedListener : public BnTransactionCompletedListener {
    std::multimap<sp<IBinder>, sp<JankDataListener>> mJankListeners;
    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);
    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:
public:
    static sp<TransactionCompletedListener> getInstance();
    static sp<TransactionCompletedListener> getInstance();