aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-14 18:42:26 +0000
committerGravatar commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-14 18:42:26 +0000
commit46de153d4e887d82b5309316ed2e26e5cdc291f0 (patch)
tree8820c146416978a32d3ec5b50e70ba58e7b292e1
parentd0c53f1d51f75e56b2e48fe5596ef4671aaa6302 (diff)
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
-rw-r--r--gm/colormatrix.cpp6
-rw-r--r--gm/convexpaths.cpp6
-rw-r--r--gyp/core.gypi2
-rw-r--r--include/core/SkInstCnt.h33
-rw-r--r--include/core/SkOnce.h (renamed from src/core/SkOnce.h)0
-rw-r--r--include/core/SkPostConfig.h4
6 files changed, 29 insertions, 22 deletions
diff --git a/gm/colormatrix.cpp b/gm/colormatrix.cpp
index 9ab6563040..2f98693da2 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 @@ static void setArray(SkPaint* paint, const SkScalar array[]) {
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 8eb4cba49d..91afbfeba3 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 @@ private:
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 56ea42a50f..55447febd0 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 89bbfa1126..1c1770ac48 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 @@ extern bool gPrintInstCount;
#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 @@ extern bool gPrintInstCount;
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 @@ extern bool gPrintInstCount;
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 @@ extern bool gPrintInstCount;
} \
\
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
index 78fd7007b0..78fd7007b0 100644
--- a/src/core/SkOnce.h
+++ b/include/core/SkOnce.h
diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h
index 2156519b2d..f08e6e1d15 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