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

Commit a74ba0f4 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Avoid extra locking in TransactionCompletedListener::getInstance

Change-Id: I823da204e3ac94b5ad7fec8a16f16f7de57f2d49
Fixes: 333947892
Test: presubmit
parent 419df213
Loading
Loading
Loading
Loading
+19 −20
Original line number Original line Diff line number Diff line
@@ -706,6 +706,7 @@ void removeDeadBufferCallback(void* /*context*/, uint64_t graphicBufferId) {


SurfaceComposerClient::Transaction::Transaction() {
SurfaceComposerClient::Transaction::Transaction() {
    mId = generateId();
    mId = generateId();
    mTransactionCompletedListener = TransactionCompletedListener::getInstance();
}
}


SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
@@ -723,6 +724,7 @@ SurfaceComposerClient::Transaction::Transaction(const Transaction& other)
    mComposerStates = other.mComposerStates;
    mComposerStates = other.mComposerStates;
    mInputWindowCommands = other.mInputWindowCommands;
    mInputWindowCommands = other.mInputWindowCommands;
    mListenerCallbacks = other.mListenerCallbacks;
    mListenerCallbacks = other.mListenerCallbacks;
    mTransactionCompletedListener = TransactionCompletedListener::getInstance();
}
}


void SurfaceComposerClient::Transaction::sanitize(int pid, int uid) {
void SurfaceComposerClient::Transaction::sanitize(int pid, int uid) {
@@ -1000,8 +1002,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Tr


        // register all surface controls for all callbackIds for this listener that is merging
        // register all surface controls for all callbackIds for this listener that is merging
        for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
        for (const auto& surfaceControl : currentProcessCallbackInfo.surfaceControls) {
            TransactionCompletedListener::getInstance()
            mTransactionCompletedListener->addSurfaceControlToCallbacks(currentProcessCallbackInfo,
                    ->addSurfaceControlToCallbacks(currentProcessCallbackInfo, surfaceControl);
                                                                        surfaceControl);
        }
        }
    }
    }


@@ -1354,7 +1356,7 @@ void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(
    auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
    auto& callbackInfo = mListenerCallbacks[TransactionCompletedListener::getIInstance()];
    callbackInfo.surfaceControls.insert(sc);
    callbackInfo.surfaceControls.insert(sc);


    TransactionCompletedListener::getInstance()->addSurfaceControlToCallbacks(callbackInfo, sc);
    mTransactionCompletedListener->addSurfaceControlToCallbacks(callbackInfo, sc);
}
}


SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition(
@@ -1672,7 +1674,7 @@ std::shared_ptr<BufferData> SurfaceComposerClient::Transaction::getAndClearBuffe


    std::shared_ptr<BufferData> bufferData = std::move(s->bufferData);
    std::shared_ptr<BufferData> bufferData = std::move(s->bufferData);


    TransactionCompletedListener::getInstance()->removeReleaseBufferCallback(
    mTransactionCompletedListener->removeReleaseBufferCallback(
            bufferData->generateReleaseCallbackId());
            bufferData->generateReleaseCallbackId());
    s->what &= ~layer_state_t::eBufferChanged;
    s->what &= ~layer_state_t::eBufferChanged;
    s->bufferData = nullptr;
    s->bufferData = nullptr;
@@ -1715,8 +1717,7 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setBuffe
            bufferData->acquireFence = *fence;
            bufferData->acquireFence = *fence;
            bufferData->flags |= BufferData::BufferDataChange::fenceChanged;
            bufferData->flags |= BufferData::BufferDataChange::fenceChanged;
        }
        }
        bufferData->releaseBufferEndpoint =
        bufferData->releaseBufferEndpoint = IInterface::asBinder(mTransactionCompletedListener);
                IInterface::asBinder(TransactionCompletedListener::getIInstance());
        setReleaseBufferCallback(bufferData.get(), callback);
        setReleaseBufferCallback(bufferData.get(), callback);
    }
    }


@@ -1774,9 +1775,10 @@ void SurfaceComposerClient::Transaction::setReleaseBufferCallback(BufferData* bu
        return;
        return;
    }
    }


    bufferData->releaseBufferListener = TransactionCompletedListener::getIInstance();
    bufferData->releaseBufferListener =
    auto listener = TransactionCompletedListener::getInstance();
            static_cast<sp<ITransactionCompletedListener>>(mTransactionCompletedListener);
    listener->setReleaseBufferCallback(bufferData->generateReleaseCallbackId(), callback);
    mTransactionCompletedListener->setReleaseBufferCallback(bufferData->generateReleaseCallbackId(),
                                                            callback);
}
}


SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDataspace(
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setDataspace(
@@ -1932,18 +1934,15 @@ SurfaceComposerClient::Transaction::setFrameRateSelectionPriority(const sp<Surfa
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::addTransactionCallback(
SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::addTransactionCallback(
        TransactionCompletedCallbackTakesContext callback, void* callbackContext,
        TransactionCompletedCallbackTakesContext callback, void* callbackContext,
        CallbackId::Type callbackType) {
        CallbackId::Type callbackType) {
    auto listener = TransactionCompletedListener::getInstance();

    auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
    auto callbackWithContext = std::bind(callback, callbackContext, std::placeholders::_1,
                                         std::placeholders::_2, std::placeholders::_3);
                                         std::placeholders::_2, std::placeholders::_3);
    const auto& surfaceControls =
    const auto& surfaceControls = mListenerCallbacks[mTransactionCompletedListener].surfaceControls;
            mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;


    CallbackId callbackId =
    CallbackId callbackId =
            listener->addCallbackFunction(callbackWithContext, surfaceControls, callbackType);
            mTransactionCompletedListener->addCallbackFunction(callbackWithContext, surfaceControls,
                                                               callbackType);


    mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(
    mListenerCallbacks[mTransactionCompletedListener].callbackIds.emplace(callbackId);
            callbackId);
    return *this;
    return *this;
}
}


@@ -2333,8 +2332,9 @@ SurfaceComposerClient::Transaction::setTrustedPresentationCallback(
        const sp<SurfaceControl>& sc, TrustedPresentationCallback cb,
        const sp<SurfaceControl>& sc, TrustedPresentationCallback cb,
        const TrustedPresentationThresholds& thresholds, void* context,
        const TrustedPresentationThresholds& thresholds, void* context,
        sp<SurfaceComposerClient::PresentationCallbackRAII>& outCallbackRef) {
        sp<SurfaceComposerClient::PresentationCallbackRAII>& outCallbackRef) {
    auto listener = TransactionCompletedListener::getInstance();
    outCallbackRef =
    outCallbackRef = listener->addTrustedPresentationCallback(cb, sc->getLayerId(), context);
            mTransactionCompletedListener->addTrustedPresentationCallback(cb, sc->getLayerId(),
                                                                          context);


    layer_state_t* s = getLayerState(sc);
    layer_state_t* s = getLayerState(sc);
    if (!s) {
    if (!s) {
@@ -2351,8 +2351,7 @@ SurfaceComposerClient::Transaction::setTrustedPresentationCallback(


SurfaceComposerClient::Transaction&
SurfaceComposerClient::Transaction&
SurfaceComposerClient::Transaction::clearTrustedPresentationCallback(const sp<SurfaceControl>& sc) {
SurfaceComposerClient::Transaction::clearTrustedPresentationCallback(const sp<SurfaceControl>& sc) {
    auto listener = TransactionCompletedListener::getInstance();
    mTransactionCompletedListener->clearTrustedPresentationCallback(sc->getLayerId());
    listener->clearTrustedPresentationCallback(sc->getLayerId());


    layer_state_t* s = getLayerState(sc);
    layer_state_t* s = getLayerState(sc);
    if (!s) {
    if (!s) {
+2 −0
Original line number Original line Diff line number Diff line
@@ -431,6 +431,8 @@ public:
        static std::mutex sApplyTokenMutex;
        static std::mutex sApplyTokenMutex;
        void releaseBufferIfOverwriting(const layer_state_t& state);
        void releaseBufferIfOverwriting(const layer_state_t& state);
        static void mergeFrameTimelineInfo(FrameTimelineInfo& t, const FrameTimelineInfo& other);
        static void mergeFrameTimelineInfo(FrameTimelineInfo& t, const FrameTimelineInfo& other);
        // Tracks registered callbacks
        sp<TransactionCompletedListener> mTransactionCompletedListener = nullptr;


    protected:
    protected:
        std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> mComposerStates;
        std::unordered_map<sp<IBinder>, ComposerState, IBinderHash> mComposerStates;