diff options
Diffstat (limited to 'libs/gui/BLASTBufferQueue.cpp')
| -rw-r--r-- | libs/gui/BLASTBufferQueue.cpp | 19 | 
1 files changed, 19 insertions, 0 deletions
| diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 56a9683773..f7ec8ef40e 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -630,7 +630,10 @@ bool BLASTBufferQueue::maxBuffersAcquired(bool includeExtraAcquire) const {  class BBQSurface : public Surface {  private: +    std::mutex mMutex;      sp<BLASTBufferQueue> mBbq; +    bool mDestroyed = false; +  public:      BBQSurface(const sp<IGraphicBufferProducer>& igbp, bool controlledByApp,                 const sp<IBinder>& scHandle, const sp<BLASTBufferQueue>& bbq) @@ -650,6 +653,10 @@ public:      status_t setFrameRate(float frameRate, int8_t compatibility,                            int8_t changeFrameRateStrategy) override { +        std::unique_lock _lock{mMutex}; +        if (mDestroyed) { +            return DEAD_OBJECT; +        }          if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,                                 "BBQSurface::setFrameRate")) {              return BAD_VALUE; @@ -658,8 +665,20 @@ public:      }      status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { +        std::unique_lock _lock{mMutex}; +        if (mDestroyed) { +            return DEAD_OBJECT; +        }          return mBbq->setFrameTimelineInfo(frameTimelineInfo);      } + +    void destroy() override { +        Surface::destroy(); + +        std::unique_lock _lock{mMutex}; +        mDestroyed = true; +        mBbq = nullptr; +    }  };  // TODO: Can we coalesce this with frame updates? Need to confirm |