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:
robertphillips@google.com 2012-06-28 21:30:45 +00:00
parent 5088eb49fe
commit 23579275c7

View File

@ -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)