| Index: include/core/SkInstCnt.h
|
| diff --git a/include/core/SkInstCnt.h b/include/core/SkInstCnt.h
|
| index cab8ebb91650ad6736e21df7efb55e3e08130824..e38c42d917a41bc3bc0dcec1e9cf218f525f7828 100644
|
| --- a/include/core/SkInstCnt.h
|
| +++ b/include/core/SkInstCnt.h
|
| @@ -14,7 +14,6 @@
|
| * instance counting machinery. A class is added to the system by adding:
|
| * SK_DECLARE_INST_COUNT at the top of its declaration for derived classes
|
| * SK_DECLARE_INST_COUNT_ROOT at the top of its declaration for a root class
|
| - * SK_DEFINE_INST_COUNT at the top of its .cpp file (for both kinds).
|
| * At the end of an application a call to all the "root" objects'
|
| * CheckInstanceCount methods should be made
|
| */
|
| @@ -29,47 +28,49 @@ extern bool gPrintInstCount;
|
| // The non-root classes just register themselves with their parent
|
| #define SK_DECLARE_INST_COUNT(className) \
|
| SK_DECLARE_INST_COUNT_INTERNAL(className, \
|
| - INHERITED::AddInstChild(CheckInstanceCount);,\
|
| - /**/)
|
| -
|
| -#define SK_DECLARE_INST_COUNT_TEMPLATE(className) \
|
| - SK_DECLARE_INST_COUNT_INTERNAL(className, \
|
| - INHERITED::AddInstChild(CheckInstanceCount);, \
|
| - typename)
|
| + INHERITED::AddInstChild(CheckInstanceCount);)
|
|
|
| // The root classes registers a function to print out the memory stats when
|
| // the app ends
|
| #define SK_DECLARE_INST_COUNT_ROOT(className) \
|
| - SK_DECLARE_INST_COUNT_INTERNAL(className, atexit(exitPrint);, /**/)
|
| + SK_DECLARE_INST_COUNT_INTERNAL(className, atexit(exitPrint);)
|
|
|
| -#define SK_DECLARE_INST_COUNT_INTERNAL(className, initStep, templateType) \
|
| +#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 \
|
| - gChildren = new SkTArray<PFCheckInstCnt>; \
|
| + GetChildren() = new SkTArray<PFCheckInstCnt>; \
|
| gInited = true; \
|
| } \
|
| - sk_atomic_inc(&gInstanceCount); \
|
| + sk_atomic_inc(GetInstanceCountPtr()); \
|
| } \
|
| \
|
| SkInstanceCountHelper(const SkInstanceCountHelper&) { \
|
| - sk_atomic_inc(&gInstanceCount); \
|
| + sk_atomic_inc(GetInstanceCountPtr()); \
|
| } \
|
| \
|
| ~SkInstanceCountHelper() { \
|
| - sk_atomic_dec(&gInstanceCount); \
|
| + sk_atomic_dec(GetInstanceCountPtr()); \
|
| + } \
|
| + \
|
| + static int32_t* GetInstanceCountPtr() { \
|
| + static int32_t gInstanceCount; \
|
| + return &gInstanceCount; \
|
| + } \
|
| + \
|
| + static SkTArray<PFCheckInstCnt>*& GetChildren() { \
|
| + static SkTArray<PFCheckInstCnt>* gChildren; \
|
| + return gChildren; \
|
| } \
|
| \
|
| - static int32_t gInstanceCount; \
|
| - static bool gInited; \
|
| - static SkTArray<PFCheckInstCnt>* gChildren; \
|
| } fInstanceCountHelper; \
|
| \
|
| static int32_t GetInstanceCount() { \
|
| - return SkInstanceCountHelper::gInstanceCount; \
|
| + return *SkInstanceCountHelper::GetInstanceCountPtr(); \
|
| } \
|
| \
|
| static void exitPrint() { \
|
| @@ -77,57 +78,50 @@ extern bool gPrintInstCount;
|
| } \
|
| \
|
| static int CheckInstanceCount(int level = 0, bool cleanUp = false) { \
|
| - if (gPrintInstCount && 0 != SkInstanceCountHelper::gInstanceCount) {\
|
| + if (gPrintInstCount && 0 != GetInstanceCount()) { \
|
| SkDebugf("%*c Leaked %s: %d\n", \
|
| 4*level, ' ', #className, \
|
| - SkInstanceCountHelper::gInstanceCount); \
|
| + GetInstanceCount()); \
|
| } \
|
| - if (NULL == SkInstanceCountHelper::gChildren) { \
|
| - return SkInstanceCountHelper::gInstanceCount; \
|
| + if (NULL == SkInstanceCountHelper::GetChildren()) { \
|
| + return GetInstanceCount(); \
|
| } \
|
| - int childCount = SkInstanceCountHelper::gChildren->count(); \
|
| - int count = SkInstanceCountHelper::gInstanceCount; \
|
| + SkTArray<int (*)(int, bool)>* children = \
|
| + SkInstanceCountHelper::GetChildren(); \
|
| + int childCount = children->count(); \
|
| + int count = GetInstanceCount(); \
|
| for (int i = 0; i < childCount; ++i) { \
|
| - count -= (*(*SkInstanceCountHelper::gChildren)[i])(level+1, cleanUp); \
|
| + count -= (*(*children)[i])(level+1, cleanUp); \
|
| } \
|
| SkASSERT(count >= 0); \
|
| if (gPrintInstCount && childCount > 0 && count > 0) { \
|
| SkDebugf("%*c Leaked ???: %d\n", 4*(level + 1), ' ', count); \
|
| } \
|
| if (cleanUp) { \
|
| - delete SkInstanceCountHelper::gChildren; \
|
| - SkInstanceCountHelper::gChildren = NULL; \
|
| + delete children; \
|
| + SkInstanceCountHelper::GetChildren() = NULL; \
|
| } \
|
| - return SkInstanceCountHelper::gInstanceCount; \
|
| + return GetInstanceCount(); \
|
| } \
|
| \
|
| - static void AddInstChild(templateType SkInstanceCountHelper::PFCheckInstCnt \
|
| - childCheckInstCnt) { \
|
| + static void AddInstChild(int (*childCheckInstCnt)(int, bool)) { \
|
| if (CheckInstanceCount != childCheckInstCnt && \
|
| - NULL != SkInstanceCountHelper::gChildren) { \
|
| - SkInstanceCountHelper::gChildren->push_back(childCheckInstCnt); \
|
| + NULL != SkInstanceCountHelper::GetChildren()) { \
|
| + SkInstanceCountHelper::GetChildren()->push_back(childCheckInstCnt); \
|
| } \
|
| }
|
|
|
| -#define SK_DEFINE_INST_COUNT(className) \
|
| - int32_t className::SkInstanceCountHelper::gInstanceCount = 0; \
|
| - bool className::SkInstanceCountHelper::gInited = false; \
|
| - SkTArray<className::SkInstanceCountHelper::PFCheckInstCnt>* \
|
| - className::SkInstanceCountHelper::gChildren = NULL;
|
| -
|
| -#define SK_DEFINE_INST_COUNT_TEMPLATE(templateInfo, className) \
|
| - templateInfo int32_t className::SkInstanceCountHelper::gInstanceCount = 0;\
|
| - templateInfo bool className::SkInstanceCountHelper::gInited = false; \
|
| - templateInfo \
|
| - SkTArray<typename className::SkInstanceCountHelper::PFCheckInstCnt>*\
|
| - className::SkInstanceCountHelper::gChildren = NULL;
|
| -
|
| #else
|
| -#define SK_DECLARE_INST_COUNT(className)
|
| -#define SK_DECLARE_INST_COUNT_TEMPLATE(className)
|
| -#define SK_DECLARE_INST_COUNT_ROOT(className)
|
| +// Typically SK_ENABLE_INST_COUNT=0. Make sure the class declares public typedef INHERITED by
|
| +// causing a compile-time error if the typedef is missing. This way SK_ENABLE_INST_COUNT=1 stays
|
| +// compiling.
|
| +#define SK_DECLARE_INST_COUNT(className) static void AddInstChild() { INHERITED::AddInstChild(); }
|
| +#define SK_DECLARE_INST_COUNT_ROOT(className) static void AddInstChild() { }
|
| +#endif
|
| +
|
| +// Following are deprecated. They are defined only for backwards API compatibility.
|
| +#define SK_DECLARE_INST_COUNT_TEMPLATE(className) SK_DECLARE_INST_COUNT(className)
|
| #define SK_DEFINE_INST_COUNT(className)
|
| #define SK_DEFINE_INST_COUNT_TEMPLATE(templateInfo, className)
|
| -#endif
|
|
|
| #endif // SkInstCnt_DEFINED
|
|
|