Merge "fix a surface leak in SurfaceFlinger"

This commit is contained in:
Mathias Agopian
2011-02-16 15:43:17 -08:00
committed by Android (Google) Code Review
4 changed files with 13 additions and 14 deletions

View File

@@ -142,7 +142,8 @@ void Layer::onRemoved()
sp<LayerBaseClient::Surface> Layer::createSurface() const
{
return mSurface;
sp<Surface> sur(new SurfaceLayer(mFlinger, const_cast<Layer *>(this)));
return sur;
}
status_t Layer::ditch()
@@ -152,9 +153,6 @@ status_t Layer::ditch()
// the layer is not on screen anymore. free as much resources as possible
mFreezeLock.clear();
// Free our own reference to ISurface
mSurface.clear();
Mutex::Autolock _l(mLock);
mWidth = mHeight = 0;
return NO_ERROR;
@@ -202,7 +200,6 @@ status_t Layer::setBuffers( uint32_t w, uint32_t h,
int layerRedsize = info.getSize(PixelFormatInfo::INDEX_RED);
mNeedsDithering = layerRedsize > displayRedSize;
mSurface = new SurfaceLayer(mFlinger, this);
return NO_ERROR;
}

View File

@@ -213,7 +213,6 @@ private:
ClientRef mUserClientRef;
// constants
sp<Surface> mSurface;
PixelFormat mFormat;
const GLExtensions& mGLExtensions;
bool mNeedsBlending;

View File

@@ -540,7 +540,9 @@ int32_t LayerBaseClient::sIdentity = 1;
LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
const sp<Client>& client)
: LayerBase(flinger, display), mClientRef(client),
: LayerBase(flinger, display),
mHasSurface(false),
mClientRef(client),
mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
{
}
@@ -557,12 +559,13 @@ sp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
{
sp<Surface> s;
Mutex::Autolock _l(mLock);
s = mClientSurface.promote();
if (s == 0) {
s = createSurface();
mClientSurface = s;
mClientSurfaceBinder = s->asBinder();
}
LOG_ALWAYS_FATAL_IF(mHasSurface,
"LayerBaseClient::getSurface() has already been called");
mHasSurface = true;
s = createSurface();
mClientSurfaceBinder = s->asBinder();
return s;
}

View File

@@ -337,7 +337,7 @@ protected:
private:
mutable Mutex mLock;
mutable wp<Surface> mClientSurface;
mutable bool mHasSurface;
wp<IBinder> mClientSurfaceBinder;
const wp<Client> mClientRef;
// only read