| Index: include/core/SkInstCnt.h
|
| diff --git a/include/core/SkInstCnt.h b/include/core/SkInstCnt.h
|
| index 89bbfa1126d12017b6a77486421baa8ad22f4b46..7e5b454b15d67f4ad7c082a5b2b3af17e1073af5 100644
|
| --- a/include/core/SkInstCnt.h
|
| +++ b/include/core/SkInstCnt.h
|
| @@ -20,9 +20,16 @@
|
| #include "SkTypes.h"
|
|
|
| #if SK_ENABLE_INST_COUNT
|
| +// Static variables inside member functions below may be defined multiple times
|
| +// if Skia is being used as a dynamic library. Instance counting should be on
|
| +// only for static builds. See bug skia:2058.
|
| +#if defined(SKIA_DLL)
|
| +#error Instance counting works only when Skia is built as a static library.
|
| +#endif
|
| +
|
| +#include "SkOnce.h"
|
| #include "SkTArray.h"
|
| #include "SkThread.h"
|
| -
|
| extern bool gPrintInstCount;
|
|
|
| // The non-root classes just register themselves with their parent
|
| @@ -38,17 +45,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 +68,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 +97,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 +116,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); \
|
| } \
|
| }
|
|
|