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

Commit 72e2d6da authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 24334 into eclair

* changes:
  fix [2037525] Fail to start camera after adb sync new Camera
parents 0a5bf257 a280496b
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -133,6 +133,14 @@ bool LayerBuffer::transformed() const
    return false;
}

void LayerBuffer::serverDestroy()
{
    sp<Source> source(clearSource());
    if (source != 0) {
        source->destroy();
    }
}

/**
 * This creates a "buffer" source for this surface
 */
@@ -413,7 +421,7 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const

    status_t err = NO_ERROR;
    NativeBuffer src(ourBuffer->getBuffer());
    const Rect& transformedBounds = mLayer.getTransformedBounds();
    const Rect transformedBounds(mLayer.getTransformedBounds());
    copybit_device_t* copybit = mBlitEngine;

    if (copybit)  {
@@ -493,7 +501,7 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
                }
            }

            const Rect& transformedBounds = mLayer.getTransformedBounds();
            const Rect transformedBounds(mLayer.getTransformedBounds());
            const copybit_rect_t& drect =
                reinterpret_cast<const copybit_rect_t&>(transformedBounds);
            const State& s(mLayer.drawingState());
@@ -583,9 +591,7 @@ LayerBuffer::OverlaySource::OverlaySource(LayerBuffer& layer,

    mOverlayHandle = overlay->getHandleRef(overlay);
    
    // NOTE: here it's okay to acquire a reference to "this" as long as
    // the reference is not released before we leave the ctor.
    sp<OverlayChannel> channel = new OverlayChannel(this);
    sp<OverlayChannel> channel = new OverlayChannel( &layer );

    *overlayRef = new OverlayRef(mOverlayHandle, channel,
            mWidth, mHeight, mFormat, mWidthStride, mHeightStride);
@@ -625,7 +631,7 @@ void LayerBuffer::OverlaySource::onVisibilityResolved(
        if (mVisibilityChanged || !mInitialized) {
            mVisibilityChanged = false;
            mInitialized = true;
            const Rect& bounds = mLayer.getTransformedBounds();
            const Rect bounds(mLayer.getTransformedBounds());
            int x = bounds.left;
            int y = bounds.top;
            int w = bounds.width();
@@ -644,17 +650,11 @@ void LayerBuffer::OverlaySource::onVisibilityResolved(
    }
}

void LayerBuffer::OverlaySource::serverDestroy() 
{
    mLayer.clearSource();
    destroyOverlay();
}

void LayerBuffer::OverlaySource::destroyOverlay() 
void LayerBuffer::OverlaySource::destroy()
{
    // we need a lock here to protect "onVisibilityResolved"
    Mutex::Autolock _l(mOverlaySourceLock);
    if (mOverlay) {
    if (mOverlay && mOverlayDevice) {
        overlay_control_device_t* overlay_dev = mOverlayDevice;
        overlay_dev->destroyOverlay(overlay_dev, mOverlay);
        mOverlay = 0;
+15 −19
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ class LayerBuffer : public LayerBaseClient
        virtual void postBuffer(ssize_t offset);
        virtual void unregisterBuffers();
        virtual bool transformed() const;
        virtual void destroy() { }
    protected:
        LayerBuffer& mLayer;
    };
@@ -81,10 +82,12 @@ public:
    sp<Source> getSource() const;
    sp<Source> clearSource();
    void setNeedsBlending(bool blending);
    const Rect& getTransformedBounds() const {
    Rect getTransformedBounds() const {
        return mTransformedBounds;
    }

    void serverDestroy();

private:
    struct NativeBuffer {
        copybit_image_t   img;
@@ -123,6 +126,7 @@ private:
        virtual void postBuffer(ssize_t offset);
        virtual void unregisterBuffers();
        virtual bool transformed() const;
        virtual void destroy() { }
    private:
        mutable Mutex                   mBufferSourceLock;
        sp<Buffer>                      mBuffer;
@@ -143,29 +147,21 @@ private:
        virtual void onDraw(const Region& clip) const;
        virtual void onTransaction(uint32_t flags);
        virtual void onVisibilityResolved(const Transform& planeTransform);
        virtual void destroy();
    private:
        void serverDestroy(); 
        void destroyOverlay();

        class OverlayChannel : public BnOverlay {
        public:
            OverlayChannel(const sp<OverlaySource>& source)
                : mSource(source) {
            }
        private:
            wp<LayerBuffer> mLayer;
            virtual void destroy() {
                sp<OverlaySource> source;
                { // scope for the lock;
                    Mutex::Autolock _l(mDestroyLock);
                    source = mSource;
                    mSource.clear();
                sp<LayerBuffer> layer(mLayer.promote());
                if (layer != 0) {
                    layer->serverDestroy();
                }
                if (source != 0) {
                    source->serverDestroy();
            }
        public:
            OverlayChannel(const sp<LayerBuffer>& layer)
                : mLayer(layer) {
            }
            mutable Mutex mDestroyLock;
            sp<OverlaySource> mSource;
        };
        
        friend class OverlayChannel;