Fixed memory deletion error in instance counting mechanism
http://codereview.appspot.com/6344057/ git-svn-id: http://skia.googlecode.com/svn/trunk@4399 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
5088eb49fe
commit
23579275c7
@ -37,10 +37,11 @@ extern bool gPrintInstCount;
|
|||||||
#define SK_DECLARE_INST_COUNT_INTERNAL(className, initStep) \
|
#define SK_DECLARE_INST_COUNT_INTERNAL(className, initStep) \
|
||||||
class SkInstanceCountHelper { \
|
class SkInstanceCountHelper { \
|
||||||
public: \
|
public: \
|
||||||
typedef int (*PFCheckInstCnt)(int level); \
|
typedef int (*PFCheckInstCnt)(int level, bool cleanUp); \
|
||||||
SkInstanceCountHelper() { \
|
SkInstanceCountHelper() { \
|
||||||
if (!gInited) { \
|
if (!gInited) { \
|
||||||
initStep \
|
initStep \
|
||||||
|
gChildren = new SkTArray<PFCheckInstCnt>; \
|
||||||
gInited = true; \
|
gInited = true; \
|
||||||
} \
|
} \
|
||||||
gInstanceCount++; \
|
gInstanceCount++; \
|
||||||
@ -56,7 +57,7 @@ extern bool gPrintInstCount;
|
|||||||
\
|
\
|
||||||
static int32_t gInstanceCount; \
|
static int32_t gInstanceCount; \
|
||||||
static bool gInited; \
|
static bool gInited; \
|
||||||
static SkTArray<PFCheckInstCnt> gChildren; \
|
static SkTArray<PFCheckInstCnt>* gChildren; \
|
||||||
} fInstanceCountHelper; \
|
} fInstanceCountHelper; \
|
||||||
\
|
\
|
||||||
static int32_t GetInstanceCount() { \
|
static int32_t GetInstanceCount() { \
|
||||||
@ -64,39 +65,47 @@ extern bool gPrintInstCount;
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static void exitPrint() { \
|
static void exitPrint() { \
|
||||||
CheckInstanceCount(); \
|
CheckInstanceCount(0, true); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static int CheckInstanceCount(int level = 0) { \
|
static int CheckInstanceCount(int level = 0, bool cleanUp = false) { \
|
||||||
if (gPrintInstCount && 0 != SkInstanceCountHelper::gInstanceCount) {\
|
if (gPrintInstCount && 0 != SkInstanceCountHelper::gInstanceCount) {\
|
||||||
SkDebugf("%*c Leaked %s: %d\n", \
|
SkDebugf("%*c Leaked %s: %d\n", \
|
||||||
4*level, ' ', #className, \
|
4*level, ' ', #className, \
|
||||||
SkInstanceCountHelper::gInstanceCount); \
|
SkInstanceCountHelper::gInstanceCount); \
|
||||||
} \
|
} \
|
||||||
int childCount = SkInstanceCountHelper::gChildren.count(); \
|
if (NULL == SkInstanceCountHelper::gChildren) { \
|
||||||
|
return SkInstanceCountHelper::gInstanceCount; \
|
||||||
|
} \
|
||||||
|
int childCount = SkInstanceCountHelper::gChildren->count(); \
|
||||||
int count = SkInstanceCountHelper::gInstanceCount; \
|
int count = SkInstanceCountHelper::gInstanceCount; \
|
||||||
for (int i = 0; i < childCount; ++i) { \
|
for (int i = 0; i < childCount; ++i) { \
|
||||||
count -= (*SkInstanceCountHelper::gChildren[i])(level+1); \
|
count -= (*(*SkInstanceCountHelper::gChildren)[i])(level+1, cleanUp); \
|
||||||
} \
|
} \
|
||||||
SkASSERT(count >= 0); \
|
SkASSERT(count >= 0); \
|
||||||
if (gPrintInstCount && childCount > 0 && count > 0) { \
|
if (gPrintInstCount && childCount > 0 && count > 0) { \
|
||||||
SkDebugf("%*c Leaked ???: %d\n", 4*(level + 1), ' ', count); \
|
SkDebugf("%*c Leaked ???: %d\n", 4*(level + 1), ' ', count); \
|
||||||
} \
|
} \
|
||||||
|
if (cleanUp) { \
|
||||||
|
delete SkInstanceCountHelper::gChildren; \
|
||||||
|
SkInstanceCountHelper::gChildren = NULL; \
|
||||||
|
} \
|
||||||
return SkInstanceCountHelper::gInstanceCount; \
|
return SkInstanceCountHelper::gInstanceCount; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static void AddInstChild(SkInstanceCountHelper::PFCheckInstCnt \
|
static void AddInstChild(SkInstanceCountHelper::PFCheckInstCnt \
|
||||||
childCheckInstCnt) { \
|
childCheckInstCnt) { \
|
||||||
if (CheckInstanceCount != childCheckInstCnt) { \
|
if (CheckInstanceCount != childCheckInstCnt && \
|
||||||
SkInstanceCountHelper::gChildren.push_back(childCheckInstCnt); \
|
NULL != SkInstanceCountHelper::gChildren) { \
|
||||||
|
SkInstanceCountHelper::gChildren->push_back(childCheckInstCnt); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SK_DEFINE_INST_COUNT(className) \
|
#define SK_DEFINE_INST_COUNT(className) \
|
||||||
int32_t className::SkInstanceCountHelper::gInstanceCount = 0; \
|
int32_t className::SkInstanceCountHelper::gInstanceCount = 0; \
|
||||||
bool className::SkInstanceCountHelper::gInited = false; \
|
bool className::SkInstanceCountHelper::gInited = false; \
|
||||||
SkTArray<className::SkInstanceCountHelper::PFCheckInstCnt> \
|
SkTArray<className::SkInstanceCountHelper::PFCheckInstCnt>* \
|
||||||
className::SkInstanceCountHelper::gChildren;
|
className::SkInstanceCountHelper::gChildren = NULL;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define SK_DECLARE_INST_COUNT(className)
|
#define SK_DECLARE_INST_COUNT(className)
|
||||||
|
Loading…
Reference in New Issue
Block a user