diff options
| author | Mathias Agopian <mathias@google.com> | 2009-06-19 17:00:27 -0700 |
|---|---|---|
| committer | Mathias Agopian <mathias@google.com> | 2009-06-19 17:00:27 -0700 |
| commit | 6edf5af578c1ab1fcd44b7c08ca371456e4b7430 (patch) | |
| tree | 28ae8dec57019f5aac653b1a2d4df5cd061ee976 /libs/surfaceflinger/Layer.cpp | |
| parent | c8fb5b1979da4829e1486e6a1008c06c979b94b0 (diff) | |
| download | frameworks_base-6edf5af578c1ab1fcd44b7c08ca371456e4b7430.zip frameworks_base-6edf5af578c1ab1fcd44b7c08ca371456e4b7430.tar.gz frameworks_base-6edf5af578c1ab1fcd44b7c08ca371456e4b7430.tar.bz2 | |
fix a memory corruption where a SF Client could be used after it's been destroyed
Diffstat (limited to 'libs/surfaceflinger/Layer.cpp')
| -rw-r--r-- | libs/surfaceflinger/Layer.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/libs/surfaceflinger/Layer.cpp b/libs/surfaceflinger/Layer.cpp index 5b260c4..218cb39 100644 --- a/libs/surfaceflinger/Layer.cpp +++ b/libs/surfaceflinger/Layer.cpp @@ -47,7 +47,7 @@ const char* const Layer::typeID = "Layer"; // --------------------------------------------------------------------------- -Layer::Layer(SurfaceFlinger* flinger, DisplayID display, Client* c, int32_t i) +Layer::Layer(SurfaceFlinger* flinger, DisplayID display, const sp<Client>& c, int32_t i) : LayerBaseClient(flinger, display, c, i), mSecure(false), mFrontBufferIndex(1), @@ -100,8 +100,7 @@ status_t Layer::ditch() return NO_ERROR; } -status_t Layer::setBuffers( Client* client, - uint32_t w, uint32_t h, +status_t Layer::setBuffers( uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { PixelFormatInfo info; @@ -285,6 +284,14 @@ sp<SurfaceBuffer> Layer::peekBuffer() return buffer; } +void Layer::scheduleBroadcast() +{ + sp<Client> ourClient(client.promote()); + if (ourClient != 0) { + mFlinger->scheduleBroadcast(ourClient); + } +} + uint32_t Layer::doTransaction(uint32_t flags) { const Layer::State& front(drawingState()); @@ -380,7 +387,7 @@ uint32_t Layer::doTransaction(uint32_t flags) eResizeBuffer1 : eResizeBuffer0; android_atomic_and(~mask, &(lcblk->swapState)); // since a buffer became available, we can let the client go... - mFlinger->scheduleBroadcast(client); + scheduleBroadcast(); mResizeTransactionDone = true; // we're being resized and there is a freeze display request, @@ -489,7 +496,7 @@ void Layer::lockPageFlip(bool& recomputeVisibleRegions) if (UNLIKELY(state & eInvalidSurface)) { // if eInvalidSurface is set, this means the surface // became invalid during a transaction (NO_MEMORY for instance) - mFlinger->scheduleBroadcast(client); + scheduleBroadcast(); return; } @@ -627,7 +634,7 @@ void Layer::unlockPageFlip( // client could be blocked, so signal them so they get a // chance to reevaluate their condition. - mFlinger->scheduleBroadcast(client); + scheduleBroadcast(); } } @@ -638,7 +645,7 @@ void Layer::finishPageFlip() "layer %p wasn't locked!", this); android_atomic_and(~eBusy, &(lcblk->swapState)); } - mFlinger->scheduleBroadcast(client); + scheduleBroadcast(); } // --------------------------------------------------------------------------- |
