From 661b2b2086b75ea8e548673e83210226e46cd49d Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Thu, 29 Sep 2011 13:58:29 -0700 Subject: Add debug informations to keep better track of layers allocation Fix coherency issue in ClassTracker (it's accessed from two different threads and we were not locking the datastructure) bug:5366807 Change-Id: I7dbd4417a49f4b3af3e09d614cec6b4568b09f7a --- .../platform/graphics/android/ClassTracker.cpp | 29 ++++++++++++++++++++++ .../platform/graphics/android/ClassTracker.h | 7 ++++++ .../platform/graphics/android/GLWebViewState.cpp | 1 + .../platform/graphics/android/LayerAndroid.cpp | 24 +++++++++++++----- .../platform/graphics/android/LayerAndroid.h | 7 +++++- 5 files changed, 61 insertions(+), 7 deletions(-) (limited to 'Source/WebCore/platform') diff --git a/Source/WebCore/platform/graphics/android/ClassTracker.cpp b/Source/WebCore/platform/graphics/android/ClassTracker.cpp index ad2b4dd..92d406c 100644 --- a/Source/WebCore/platform/graphics/android/ClassTracker.cpp +++ b/Source/WebCore/platform/graphics/android/ClassTracker.cpp @@ -26,6 +26,8 @@ #include "config.h" #include "ClassTracker.h" +#include "LayerAndroid.h" + #include #include #include @@ -46,6 +48,7 @@ ClassTracker* ClassTracker::gInstance = 0; void ClassTracker::increment(String name) { + android::Mutex::Autolock lock(m_lock); int value = 0; if (m_classes.contains(name)) value = m_classes.get(name); @@ -55,6 +58,7 @@ void ClassTracker::increment(String name) void ClassTracker::decrement(String name) { + android::Mutex::Autolock lock(m_lock); int value = 0; if (m_classes.contains(name)) value = m_classes.get(name); @@ -62,13 +66,38 @@ void ClassTracker::decrement(String name) m_classes.set(name, value - 1); } + +void ClassTracker::add(LayerAndroid* layer) +{ + android::Mutex::Autolock lock(m_lock); + m_layers.append(layer); +} + +void ClassTracker::remove(LayerAndroid* layer) +{ + android::Mutex::Autolock lock(m_lock); + m_layers.remove(m_layers.find(layer)); +} + void ClassTracker::show() { + android::Mutex::Autolock lock(m_lock); XLOG("*** Tracking %d classes ***", m_classes.size()); for (HashMap::iterator iter = m_classes.begin(); iter != m_classes.end(); ++iter) { XLOG("class %s has %d instances", iter->first.latin1().data(), iter->second); } + XLOG("*** %d Layers ***", m_layers.size()); + for (unsigned int i = 0; i < m_layers.size(); i++) { + LayerAndroid* layer = m_layers[i]; + XLOG("[%d/%d] layer %x (%.2f, %.2f) of type %d, refcount(%d) has texture %x has image ref %x (%x) root: %x parent: %x", + i, m_layers.size(), layer, + layer->getWidth(), layer->getHeight(), + layer->type(), layer->getRefCnt(), + layer->texture(), layer->imageRef(), + layer->imageTexture(), (LayerAndroid*) layer->getRootLayer(), + (LayerAndroid*) layer->getParent()); + } } } // namespace WebCore diff --git a/Source/WebCore/platform/graphics/android/ClassTracker.h b/Source/WebCore/platform/graphics/android/ClassTracker.h index e338cbd..d169883 100644 --- a/Source/WebCore/platform/graphics/android/ClassTracker.h +++ b/Source/WebCore/platform/graphics/android/ClassTracker.h @@ -26,6 +26,7 @@ #ifndef ClassTracker_h #define ClassTracker_h +#include #include #include @@ -34,16 +35,22 @@ namespace WebCore { +class LayerAndroid; + class ClassTracker { public: static ClassTracker* instance(); void show(); void increment(String name); void decrement(String name); + void add(LayerAndroid*); + void remove(LayerAndroid*); private: ClassTracker() {}; HashMap m_classes; + Vector m_layers; static ClassTracker* gInstance; + android::Mutex m_lock; }; } diff --git a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp index 2f3613b..85fa23f 100644 --- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -659,6 +659,7 @@ bool GLWebViewState::drawGL(IntRect& rect, SkRect& viewport, IntRect* invalRect, SkSafeUnref(baseLayer); #ifdef DEBUG TilesManager::instance()->getTilesTracker()->showTrackTextures(); + TilesManager::instance()->showImages(); #endif return ret; } diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp index b8db80b..b086c79 100644 --- a/Source/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -73,7 +73,8 @@ LayerAndroid::LayerAndroid(RenderLayer* owner) : Layer(), m_requestSent(false), m_scale(1), m_lastComputeTextureSize(0), - m_owningLayer(owner) + m_owningLayer(owner), + m_type(LayerAndroid::WebCoreLayer) { m_backgroundColor = 0; @@ -83,6 +84,7 @@ LayerAndroid::LayerAndroid(RenderLayer* owner) : Layer(), m_dirtyRegion.setEmpty(); #ifdef DEBUG_COUNT ClassTracker::instance()->increment("LayerAndroid"); + ClassTracker::instance()->add(this); #endif } @@ -94,7 +96,8 @@ LayerAndroid::LayerAndroid(const LayerAndroid& layer) : Layer(layer), m_texture(0), m_imageTexture(0), m_requestSent(false), - m_owningLayer(layer.m_owningLayer) + m_owningLayer(layer.m_owningLayer), + m_type(LayerAndroid::UILayer) { m_isFixed = layer.m_isFixed; m_imageRef = layer.m_imageRef; @@ -139,7 +142,8 @@ LayerAndroid::LayerAndroid(const LayerAndroid& layer) : Layer(layer), } #ifdef DEBUG_COUNT - ClassTracker::instance()->increment("LayerAndroid"); + ClassTracker::instance()->increment("LayerAndroid - recopy (UI?)"); + ClassTracker::instance()->add(this); #endif } @@ -156,7 +160,8 @@ LayerAndroid::LayerAndroid(SkPicture* picture) : Layer(), m_requestSent(false), m_scale(1), m_lastComputeTextureSize(0), - m_owningLayer(0) + m_owningLayer(0), + m_type(LayerAndroid::NavCacheLayer) { m_backgroundColor = 0; m_dirty = false; @@ -164,7 +169,8 @@ LayerAndroid::LayerAndroid(SkPicture* picture) : Layer(), m_iframeOffset.set(0,0); m_dirtyRegion.setEmpty(); #ifdef DEBUG_COUNT - ClassTracker::instance()->increment("LayerAndroid"); + ClassTracker::instance()->increment("LayerAndroid - from picture"); + ClassTracker::instance()->add(this); #endif } @@ -176,7 +182,13 @@ LayerAndroid::~LayerAndroid() SkSafeUnref(m_recordingPicture); m_animations.clear(); #ifdef DEBUG_COUNT - ClassTracker::instance()->decrement("LayerAndroid"); + ClassTracker::instance()->remove(this); + if (m_type == LayerAndroid::WebCoreLayer) + ClassTracker::instance()->decrement("LayerAndroid"); + else if (m_type == LayerAndroid::UILayer) + ClassTracker::instance()->decrement("LayerAndroid - recopy (UI)"); + else if (m_type == LayerAndroid::NavCacheLayer) + ClassTracker::instance()->decrement("LayerAndroid - from picture"); #endif } diff --git a/Source/WebCore/platform/graphics/android/LayerAndroid.h b/Source/WebCore/platform/graphics/android/LayerAndroid.h index d6bb497..4ae8bd3 100644 --- a/Source/WebCore/platform/graphics/android/LayerAndroid.h +++ b/Source/WebCore/platform/graphics/android/LayerAndroid.h @@ -100,6 +100,7 @@ class PaintedSurface; class LayerAndroid : public Layer { public: + enum LayerType { UndefinedLayer, WebCoreLayer, UILayer, NavCacheLayer }; LayerAndroid(RenderLayer* owner); LayerAndroid(const LayerAndroid& layer); LayerAndroid(SkPicture*); @@ -272,6 +273,10 @@ public: void assignTextureTo(LayerAndroid* newTree); void createTexture(); + SkBitmapRef* imageRef() { return m_imageRef; } + ImageTexture* imageTexture() { return m_imageTexture; } + int type() { return m_type; } + protected: virtual void onDraw(SkCanvas*, SkScalar opacity); @@ -379,7 +384,7 @@ private: RenderLayer* m_owningLayer; GLWebViewState* m_state; - + int m_type; typedef Layer INHERITED; }; -- cgit v1.1