diff options
author | Nicolas Roard <nicolasroard@google.com> | 2011-09-29 13:58:29 -0700 |
---|---|---|
committer | Nicolas Roard <nicolasroard@google.com> | 2011-09-29 14:44:10 -0700 |
commit | 661b2b2086b75ea8e548673e83210226e46cd49d (patch) | |
tree | f97001c9142249e9a74a5533d522892379b2f5cd /Source/WebCore/platform | |
parent | 74523e723bc5677780989d6a5834adc5c72c3683 (diff) | |
download | external_webkit-661b2b2086b75ea8e548673e83210226e46cd49d.zip external_webkit-661b2b2086b75ea8e548673e83210226e46cd49d.tar.gz external_webkit-661b2b2086b75ea8e548673e83210226e46cd49d.tar.bz2 |
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
Diffstat (limited to 'Source/WebCore/platform')
5 files changed, 61 insertions, 7 deletions
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 <cutils/log.h> #include <wtf/CurrentTime.h> #include <wtf/text/CString.h> @@ -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<String, int>::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 <utils/threads.h> #include <wtf/HashMap.h> #include <wtf/text/StringHash.h> @@ -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<String, int> m_classes; + Vector<LayerAndroid*> 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; }; |