diff options
author | Nicolas Roard <nicolas@android.com> | 2011-02-10 17:05:41 -0800 |
---|---|---|
committer | Nicolas Roard <nicolas@android.com> | 2011-02-10 19:18:53 -0800 |
commit | 81ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8 (patch) | |
tree | 24a0189562324f344a142c7ea9af31d84b5b2627 /WebCore/platform/graphics/android/LayerAndroid.cpp | |
parent | c2b6a2ab53dae1fbb596bfbfe520f80960ddc34d (diff) | |
download | external_webkit-81ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8.zip external_webkit-81ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8.tar.gz external_webkit-81ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8.tar.bz2 |
Fix ANR in the browser
Sometimes we were not releasing textures as they were busy; they could
still be deleted when swapping the layers trees, and as they were
also still present in the LayerTexture Hashmap this was causing an ANR
(at best -- the texture was already deallocated, the LayerTexture dtor
was then trying to release() them...)
bug:3398660
Change-Id: I2747dd4630a2a7dc18eae4c5fde36fd14c461747
Diffstat (limited to 'WebCore/platform/graphics/android/LayerAndroid.cpp')
-rw-r--r-- | WebCore/platform/graphics/android/LayerAndroid.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/WebCore/platform/graphics/android/LayerAndroid.cpp b/WebCore/platform/graphics/android/LayerAndroid.cpp index 42104dc..8771d3b 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -157,28 +157,31 @@ LayerAndroid::LayerAndroid(SkPicture* picture) : SkLayer(), #endif } -void LayerAndroid::removeTexture(BackedDoubleBufferedTexture* aTexture) +bool LayerAndroid::removeTexture(BackedDoubleBufferedTexture* aTexture) { LayerTexture* texture = static_cast<LayerTexture*>(aTexture); android::AutoMutex lock(m_atomicSync); + + bool textureReleased = true; if (!texture) { // remove ourself from both textures if (m_drawingTexture) - m_drawingTexture->release(this); + textureReleased &= m_drawingTexture->release(this); if (m_reservedTexture && m_reservedTexture != m_drawingTexture) - m_reservedTexture->release(this); + textureReleased &= m_reservedTexture->release(this); } else { if (m_drawingTexture && m_drawingTexture == texture) - m_drawingTexture->release(this); + textureReleased &= m_drawingTexture->release(this); if (m_reservedTexture && m_reservedTexture == texture && m_reservedTexture != m_drawingTexture) - m_reservedTexture->release(this); + textureReleased &= m_reservedTexture->release(this); } if (m_drawingTexture && m_drawingTexture->owner() != this) m_drawingTexture = 0; if (m_reservedTexture && m_reservedTexture->owner() != this) m_reservedTexture = 0; + return textureReleased; } LayerAndroid::~LayerAndroid() @@ -926,7 +929,7 @@ void LayerAndroid::paintBitmapGL() // If LayerAndroid::removeTexture() is called before us, we'd have bailed // out early as texture would have been null; if it is called after us, we'd // have marked the texture has being busy, and the texture will not be - // destroy immediately. + // destroyed immediately. texture->producerAcquireContext(); TextureInfo* textureInfo = texture->producerLock(); m_atomicSync.unlock(); |