Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: include/core/SkInstCnt.h

Issue 98703002: Fix compilation with SK_ENABLE_INST_COUNT=1 (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gyp/gpu.gypi ('k') | include/lazy/SkLruImageCache.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « gyp/gpu.gypi ('k') | include/lazy/SkLruImageCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698