diff options
author | Brian Smith <brian@dbsoft.org> | 2023-04-21 19:10:43 -0500 |
---|---|---|
committer | Brian Smith <brian@dbsoft.org> | 2023-04-27 13:35:07 -0500 |
commit | 22d254b4797eba381a0bfbb85903bf653c7fa9ea (patch) | |
tree | 279ac6c982bb3e1fbffe1ba8c0da6b919991f46b /xpcom | |
parent | 30a6828f475a76f88c292b8b3fd0163839db5b29 (diff) | |
download | uxp-22d254b4797eba381a0bfbb85903bf653c7fa9ea.tar.gz |
Issue #1691 - Part 10: Add and use method to annotate CC crashes with a class name.
https://bugzilla.mozilla.org/show_bug.cgi?id=1277260
Make PtrInfo into a class and mark it final.
Also fix an erroneous debug assert because mBaseURL not set in one code path.
(cherry picked from commit a1890054011adf0cf87be0d56047418c9f201420)
Diffstat (limited to 'xpcom')
-rw-r--r-- | xpcom/base/nsCycleCollector.cpp | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp index 8df3c3a6bc..2e5804929e 100644 --- a/xpcom/base/nsCycleCollector.cpp +++ b/xpcom/base/nsCycleCollector.cpp @@ -337,7 +337,7 @@ public: // Base types //////////////////////////////////////////////////////////////////////// -struct PtrInfo; +class PtrInfo; class EdgePool { @@ -533,13 +533,15 @@ enum NodeColor { black, white, grey }; // hundreds of thousands of them to be allocated and touched // repeatedly during each cycle collection. -struct PtrInfo +class PtrInfo final { +public: void* mPointer; nsCycleCollectionParticipant* mParticipant; uint32_t mColor : 2; uint32_t mInternalRefs : 30; uint32_t mRefCount; + private: EdgePool::Iterator mFirstChild; @@ -609,8 +611,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. @@ -2294,8 +2317,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++; @@ -3109,9 +3134,8 @@ nsCycleCollector::ScanWhiteNodes(bool aFullySynchGraphBuild) continue; } - if (pi->mInternalRefs > pi->mRefCount) { - 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. } |