From e9940ac956d2b8f57f1eb4f261b6f9b32282822a Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Fri, 15 Sep 2017 13:00:17 -0700 Subject: [PATCH] Bug 1277260, part 2 - Add and use method to annotate CC crashes with a class name. r=rweiss+418169,smaug MozReview-Commit-ID: JweRzAC89NS --HG-- extra : rebase_source : 6290588e1a4d1c8f59bd13bd975aa7c4f13903df --- xpcom/base/nsCycleCollector.cpp | 40 ++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp index 32335c6a1d43..f51d2fe6e266 100644 --- a/xpcom/base/nsCycleCollector.cpp +++ b/xpcom/base/nsCycleCollector.cpp @@ -657,8 +657,29 @@ public: CC_GRAPH_ASSERT(aLastChild.Initialized()); (this + 1)->mFirstChild = aLastChild; } + + void AnnotatedReleaseAssert(bool aCondition, const char* aMessage); }; +void +PtrInfo::AnnotatedReleaseAssert(bool aCondition, const char* aMessage) +{ + if (aCondition) { + return; + } + +#ifdef MOZ_CRASHREPORTER + const char* piName = "Unknown"; + if (mParticipant) { + piName = mParticipant->ClassName(); + } + nsPrintfCString msg("%s, for class %s", aMessage, piName); + CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("CycleCollector"), msg); +#endif + + MOZ_CRASH(); +} + /** * A structure designed to be used like a linked list of PtrInfo, except * it allocates many PtrInfos at a time. @@ -2372,8 +2393,10 @@ CCGraphBuilder::NoteNativeRoot(void* aRoot, NS_IMETHODIMP_(void) CCGraphBuilder::DescribeRefCountedNode(nsrefcnt aRefCount, const char* aObjName) { - MOZ_RELEASE_ASSERT(aRefCount != 0, "CCed refcounted object has zero refcount"); - MOZ_RELEASE_ASSERT(aRefCount != UINT32_MAX, "CCed refcounted object has overflowing refcount"); + mCurrPi->AnnotatedReleaseAssert(aRefCount != 0, + "CCed refcounted object has zero refcount"); + mCurrPi->AnnotatedReleaseAssert(aRefCount != UINT32_MAX, + "CCed refcounted object has overflowing refcount"); mResults.mVisitedRefCounted++; @@ -3204,17 +3227,8 @@ nsCycleCollector::ScanWhiteNodes(bool aFullySynchGraphBuild) continue; } - if (pi->mInternalRefs > pi->mRefCount) { -#ifdef MOZ_CRASHREPORTER - const char* piName = "Unknown"; - if (pi->mParticipant) { - piName = pi->mParticipant->ClassName(); - } - nsPrintfCString msg("More references to an object than its refcount, for class %s", piName); - CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("CycleCollector"), msg); -#endif - MOZ_CRASH(); - } + pi->AnnotatedReleaseAssert(pi->mInternalRefs <= pi->mRefCount, + "More references to an object than its refcount"); // This node will get marked black in the next pass. }