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

Commit a52a5b6e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "SF: Fix mGraphicBufferProducerList"

parents ca22f2e7 101d8dc0
Loading
Loading
Loading
Loading
+7 −20
Original line number Diff line number Diff line
@@ -33,26 +33,13 @@ MonitoredProducer::~MonitoredProducer() {
    // because we don't know where this destructor is called from. It could be
    // called with the mStateLock held, leading to a dead-lock (it actually
    // happens).
    class MessageCleanUpList : public MessageBase {
    public:
        MessageCleanUpList(const sp<SurfaceFlinger>& flinger,
                const wp<IBinder>& producer)
            : mFlinger(flinger), mProducer(producer) {}
    sp<LambdaMessage> cleanUpListMessage =
            new LambdaMessage([flinger = mFlinger, asBinder = wp<IBinder>(onAsBinder())]() {
                Mutex::Autolock lock(flinger->mStateLock);
                flinger->mGraphicBufferProducerList.erase(asBinder);
            });

        virtual ~MessageCleanUpList() {}

        virtual bool handler() {
            Mutex::Autolock _l(mFlinger->mStateLock);
            mFlinger->mGraphicBufferProducerList.remove(mProducer);
            return true;
        }

    private:
        sp<SurfaceFlinger> mFlinger;
        wp<IBinder> mProducer;
    };

    mFlinger->postMessageAsync(new MessageCleanUpList(mFlinger, asBinder(mProducer)));
    mFlinger->postMessageAsync(cleanUpListMessage);
}

status_t MonitoredProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
+4 −2
Original line number Diff line number Diff line
@@ -701,7 +701,7 @@ bool SurfaceFlinger::authenticateSurfaceTexture(
bool SurfaceFlinger::authenticateSurfaceTextureLocked(
        const sp<IGraphicBufferProducer>& bufferProducer) const {
    sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
    return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
    return mGraphicBufferProducerList.count(surfaceTextureBinder.get()) > 0;
}

status_t SurfaceFlinger::getSupportedFrameTimestamps(
@@ -2893,7 +2893,9 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
            parent->addChild(lbc);
        }

        mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
        mGraphicBufferProducerList.insert(IInterface::asBinder(gbc).get());
        LOG_ALWAYS_FATAL_IF(mGraphicBufferProducerList.size() > MAX_LAYERS,
                            "Suspected IGBP leak");
        mLayersAdded = true;
        mNumLayers++;
    }
+3 −1
Original line number Diff line number Diff line
@@ -717,7 +717,9 @@ private:
    bool mTransactionPending;
    bool mAnimTransactionPending;
    SortedVector< sp<Layer> > mLayersPendingRemoval;
    SortedVector< wp<IBinder> > mGraphicBufferProducerList;

    // Can't be unordered_set because wp<> isn't hashable
    std::set<wp<IBinder>> mGraphicBufferProducerList;

    // protected by mStateLock (but we could use another lock)
    bool mLayersRemoved;