diff options
author | Mathias Agopian <mathias@google.com> | 2009-09-08 23:52:08 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-09-09 00:50:29 -0700 |
commit | a280496bd2ce04d6beff4536f2115a9a4d7568e4 (patch) | |
tree | d796ce8eae898c35617bd3501b44c778e129fbfa /libs/surfaceflinger/LayerBuffer.h | |
parent | b34d143bce3905c23aa5c1b2b147ec6df48cf9d7 (diff) | |
download | frameworks_base-a280496bd2ce04d6beff4536f2115a9a4d7568e4.zip frameworks_base-a280496bd2ce04d6beff4536f2115a9a4d7568e4.tar.gz frameworks_base-a280496bd2ce04d6beff4536f2115a9a4d7568e4.tar.bz2 |
fix [2037525] Fail to start camera after adb sync new Camera
we ended-up locking a Mutex that had been destroyed.
This happened because we gave an sp<Source> to the outside world,
and were called after LayerBuffer had been destroyed.
Instead we now give a wp<LayerBuffer> to the outside and have it
do the destruction.
Diffstat (limited to 'libs/surfaceflinger/LayerBuffer.h')
-rw-r--r-- | libs/surfaceflinger/LayerBuffer.h | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/libs/surfaceflinger/LayerBuffer.h b/libs/surfaceflinger/LayerBuffer.h index 3b09998..0452818 100644 --- a/libs/surfaceflinger/LayerBuffer.h +++ b/libs/surfaceflinger/LayerBuffer.h @@ -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(); - } - if (source != 0) { - source->serverDestroy(); + sp<LayerBuffer> layer(mLayer.promote()); + if (layer != 0) { + layer->serverDestroy(); } } - mutable Mutex mDestroyLock; - sp<OverlaySource> mSource; + public: + OverlayChannel(const sp<LayerBuffer>& layer) + : mLayer(layer) { + } }; friend class OverlayChannel; |