Loading services/surfaceflinger/MonitoredProducer.cpp +7 −20 Original line number Diff line number Diff line Loading @@ -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) { Loading services/surfaceflinger/SurfaceFlinger.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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( Loading Loading @@ -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++; } Loading services/surfaceflinger/SurfaceFlinger.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
services/surfaceflinger/MonitoredProducer.cpp +7 −20 Original line number Diff line number Diff line Loading @@ -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) { Loading
services/surfaceflinger/SurfaceFlinger.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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( Loading Loading @@ -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++; } Loading
services/surfaceflinger/SurfaceFlinger.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; Loading