summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2011-09-29 13:58:29 -0700
committerNicolas Roard <nicolasroard@google.com>2011-09-29 14:44:10 -0700
commit661b2b2086b75ea8e548673e83210226e46cd49d (patch)
treef97001c9142249e9a74a5533d522892379b2f5cd /Source/WebCore/platform
parent74523e723bc5677780989d6a5834adc5c72c3683 (diff)
downloadexternal_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')
-rw-r--r--Source/WebCore/platform/graphics/android/ClassTracker.cpp29
-rw-r--r--Source/WebCore/platform/graphics/android/ClassTracker.h7
-rw-r--r--Source/WebCore/platform/graphics/android/GLWebViewState.cpp1
-rw-r--r--Source/WebCore/platform/graphics/android/LayerAndroid.cpp24
-rw-r--r--Source/WebCore/platform/graphics/android/LayerAndroid.h7
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;
};