Make leak counters thread-safe and turn them on by default for Debug
Make leak counters implemented with SK_DECLARE_INST_COUNT thread-safe.
Enable the leak counting for Debug builds.
Protect the instance counter initialization step (initStep) by
using SkOnce.
Makes SkOnce.h part of the public API, since SkInstCnt is public.
Protect the per-class child list shared variable with a per-class mutex.
Changes the behavior in the way that if the child list has been
"cleaned up", it will still try to create subsequent child lists.
BUG=skia:1219
Committed: http://code.google.com/p/skia/source/detail?r=12635
R=robertphillips@google.com, mtklein@google.com, bsalomon@google.com, bungeman@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/99483003
git-svn-id: http://skia.googlecode.com/svn/trunk@13068 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp
index 9ab6563..2f98693 100644
--- a/gm/colormatrix.cpp
+++ b/gm/colormatrix.cpp
@@ -12,9 +12,9 @@
#define WIDTH 500
#define HEIGHT 500
-class SkOnce {
+class SkDoOnce {
public:
- SkOnce() : fOnce(false) {};
+ SkDoOnce() : fOnce(false) {};
bool once() const {
if (fOnce) {
@@ -39,7 +39,7 @@
namespace skiagm {
class ColorMatrixGM : public GM {
- SkOnce fOnce;
+ SkDoOnce fOnce;
void init() {
if (fOnce.once()) {
fSolidBitmap = this->createSolidBitmap(64, 64);
diff --git a/gm/convexpaths.cpp b/gm/convexpaths.cpp
index 8eb4cba..91afbfe 100644
--- a/gm/convexpaths.cpp
+++ b/gm/convexpaths.cpp
@@ -9,9 +9,9 @@
#include "SkRandom.h"
#include "SkTArray.h"
-class SkOnce : SkNoncopyable {
+class SkDoOnce : SkNoncopyable {
public:
- SkOnce() { fDidOnce = false; }
+ SkDoOnce() { fDidOnce = false; }
bool needToDo() const { return !fDidOnce; }
bool alreadyDone() const { return fDidOnce; }
@@ -27,7 +27,7 @@
namespace skiagm {
class ConvexPathsGM : public GM {
- SkOnce fOnce;
+ SkDoOnce fOnce;
public:
ConvexPathsGM() {
this->setBGColor(0xFF000000);
diff --git a/gyp/core.gypi b/gyp/core.gypi
index 56ea42a..55447fe 100644
--- a/gyp/core.gypi
+++ b/gyp/core.gypi
@@ -114,7 +114,6 @@
'<(skia_src_path)/core/SkMessageBus.h',
'<(skia_src_path)/core/SkMetaData.cpp',
'<(skia_src_path)/core/SkMipMap.cpp',
- '<(skia_src_path)/core/SkOnce.h',
'<(skia_src_path)/core/SkOrderedReadBuffer.cpp',
'<(skia_src_path)/core/SkOrderedWriteBuffer.cpp',
'<(skia_src_path)/core/SkPackBits.cpp',
@@ -256,6 +255,7 @@
'<(skia_include_path)/core/SkMath.h',
'<(skia_include_path)/core/SkMatrix.h',
'<(skia_include_path)/core/SkMetaData.h',
+ '<(skia_include_path)/core/SkOnce.h',
'<(skia_include_path)/core/SkOSFile.h',
'<(skia_include_path)/core/SkPackBits.h',
'<(skia_include_path)/core/SkPaint.h',
diff --git a/include/core/SkInstCnt.h b/include/core/SkInstCnt.h
index 89bbfa1..1c1770a 100644
--- a/include/core/SkInstCnt.h
+++ b/include/core/SkInstCnt.h
@@ -20,6 +20,7 @@
#include "SkTypes.h"
#if SK_ENABLE_INST_COUNT
+#include "SkOnce.h"
#include "SkTArray.h"
#include "SkThread.h"
@@ -38,17 +39,16 @@
#define SK_DECLARE_INST_COUNT_INTERNAL(className, initStep) \
class SkInstanceCountHelper { \
public: \
- typedef int (*PFCheckInstCnt)(int level, bool cleanUp); \
SkInstanceCountHelper() { \
- static bool gInited; \
- if (!gInited) { \
- initStep \
- GetChildren() = new SkTArray<PFCheckInstCnt>; \
- gInited = true; \
- } \
+ SK_DECLARE_STATIC_ONCE(once); \
+ SkOnce(&once, init, 0); \
sk_atomic_inc(GetInstanceCountPtr()); \
} \
\
+ static void init(int) { \
+ initStep \
+ } \
+ \
SkInstanceCountHelper(const SkInstanceCountHelper&) { \
sk_atomic_inc(GetInstanceCountPtr()); \
} \
@@ -62,11 +62,16 @@
return &gInstanceCount; \
} \
\
- static SkTArray<PFCheckInstCnt>*& GetChildren() { \
- static SkTArray<PFCheckInstCnt>* gChildren; \
+ static SkTArray<int (*)(int, bool)>*& GetChildren() { \
+ static SkTArray<int (*)(int, bool)>* gChildren; \
return gChildren; \
} \
\
+ static SkBaseMutex& GetChildrenMutex() { \
+ SK_DECLARE_STATIC_MUTEX(childrenMutex); \
+ return childrenMutex; \
+ } \
+ \
} fInstanceCountHelper; \
\
static int32_t GetInstanceCount() { \
@@ -86,7 +91,7 @@
if (NULL == SkInstanceCountHelper::GetChildren()) { \
return GetInstanceCount(); \
} \
- SkTArray<int (*)(int, bool)>* children = \
+ SkTArray<int (*)(int, bool)>* children = \
SkInstanceCountHelper::GetChildren(); \
int childCount = children->count(); \
int count = GetInstanceCount(); \
@@ -105,8 +110,12 @@
} \
\
static void AddInstChild(int (*childCheckInstCnt)(int, bool)) { \
- if (CheckInstanceCount != childCheckInstCnt && \
- NULL != SkInstanceCountHelper::GetChildren()) { \
+ if (CheckInstanceCount != childCheckInstCnt) { \
+ SkAutoMutexAcquire ama(SkInstanceCountHelper::GetChildrenMutex()); \
+ if (NULL == SkInstanceCountHelper::GetChildren()) { \
+ SkInstanceCountHelper::GetChildren() = \
+ new SkTArray<int (*)(int, bool)>; \
+ } \
SkInstanceCountHelper::GetChildren()->push_back(childCheckInstCnt); \
} \
}
diff --git a/src/core/SkOnce.h b/include/core/SkOnce.h
similarity index 100%
rename from src/core/SkOnce.h
rename to include/core/SkOnce.h
diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h
index 2156519..f08e6e1 100644
--- a/include/core/SkPostConfig.h
+++ b/include/core/SkPostConfig.h
@@ -120,12 +120,10 @@
* SK_ENABLE_INST_COUNT controlls printing how many reference counted objects
* are still held on exit.
* Defaults to 1 in DEBUG and 0 in RELEASE.
- * FIXME: currently always 0, since it fails if multiple threads run at once
- * (see skbug.com/1219 ).
*/
#ifndef SK_ENABLE_INST_COUNT
# ifdef SK_DEBUG
-# define SK_ENABLE_INST_COUNT 0
+# define SK_ENABLE_INST_COUNT 1
# else
# define SK_ENABLE_INST_COUNT 0
# endif