Closed
Bug 808467
Opened 13 years ago
Closed 13 years ago
Rewrite the cycle collector's memory reporter.
Categories
(Core :: XPCOM, defect)
Core
XPCOM
Tracking
()
RESOLVED
FIXED
mozilla19
People
(Reporter: n.nethercote, Assigned: n.nethercote)
References
Details
Attachments
(1 file)
|
22.53 KB,
patch
|
mccr8
:
review+
|
Details | Diff | Splinter Review |
The cycle collector's memory reporter can be improved.
| Assignee | ||
Comment 1•13 years ago
|
||
This patch:
- Rewrites the cycle collector memory reporter to be traversal-based instead of
counter-based. This is less error-prone and integrates with DMD.
- Converts the reporter to a multi-reporter that measures five different
things: collector-object, graph-nodes, graph-edges, white-nodes-array,
purple-buffer. I've been unable to see the middle three have any value
other than zero, which matches what the existing comments say should happen
(i.e. they should only be non-zero during CC).
- Tweaks the size of nsPurpleBuffer::mEntries to waste less space, and adds a
static assertion to make sure the size is as expected.
- Removes some unnecessary whitespace at the end of lines.
It would be nice if the first purple buffer block wasn't within
nsCycleCollector, but I didn't go to the effort of changing that.
Attachment #678207 -
Flags: review?(continuation)
Comment 2•13 years ago
|
||
Comment on attachment 678207 [details] [diff] [review]
Rewrite the cycle collector's memory reporter.
Review of attachment 678207 [details] [diff] [review]:
-----------------------------------------------------------------
Thanks for fixing this! The level of detail in the reporters seems like overkill, but I guess there's no reason not to have it now that the code is written.
You may or may not want to add a similar explanatory comment for why SizeOf for the node and edge structures don't follow the pointers, to match those for other structures.
::: xpcom/base/nsCycleCollector.cpp
@@ +737,5 @@
> + // - On 32-bit platforms sizeof(nsPurpleBufferEntry) is 12, so mEntries
> + // is 16,380 bytes, which leaves 4 bytes for mNext.
> + // - On 64-bit platforms sizeof(nsPurpleBufferEntry) is 24, so mEntries
> + // is 32,544 bytes, which leaves 8 bytes for mNext.
> + nsPurpleBufferEntry mEntries[1365];
I don't know if 5 more entries helps much, but thanks for the explanation here. :)
@@ +3002,5 @@
> + *aObjectSize = aMallocSizeOf(this);
> +
> + mGraph.SizeOfExcludingThis(aMallocSizeOf, aGraphNodesSize, aGraphEdgesSize);
> +
> + // No need to measure what the entries point to; the pointers are
double space after ;
@@ +3041,5 @@
> + &objectSize, &graphNodesSize,
> + &graphEdgesSize, &whiteNodesSize,
> + &purpleBufferSize);
> +
> + #define REPORT(_path, _amount, _desc) \
Could this be a method instead of a macro? Macros are evil!
@@ +3058,5 @@
> + REPORT("explicit/cycle-collector/collector-object", objectSize,
> + "Memory used for the cycle collector object itself.");
> +
> + REPORT("explicit/cycle-collector/graph-nodes", graphNodesSize,
> + "Memory used for the cycle collector's graph's nodes. "
"for the nodes of the cycle collector's graph" maybe? The two possessives in a row bothers me. ;) Same with edges below.
@@ +3084,5 @@
> + }
> +};
> +
> +NS_IMPL_ISUPPORTS1(CycleCollectorMultiReporter
> + , nsIMemoryMultiReporter
Is it really necessary to use this future-proof style? Is this likely to ever change?
@@ +3100,5 @@
> if (sCollector)
> sCollector->RegisterJSRuntime(rt);
> if (regMemReport) {
> regMemReport = false;
> + sCollectorReporter = new CycleCollectorMultiReporter;
The placement of the creation/destruction of the reporter in register/forgoetJSRuntime seems a little off to me. In a browser without XPConnect (which happens in tests for reasons I don't entirely fathom) we'll end up leaking the reporter.
Can they go in nsCycleCollector_startup/nsCycleCollector_shutdown instead?
@@ +3106,4 @@
> }
> }
>
> void
might as well remove this trailing whitespace if you are feeling ambitious
Attachment #678207 -
Flags: review?(continuation) → review+
| Assignee | ||
Comment 3•13 years ago
|
||
> Thanks for fixing this! The level of detail in the reporters seems like
> overkill, but I guess there's no reason not to have it now that the code is
> written.
It's the same level of detail as before :)
> > + #define REPORT(_path, _amount, _desc) \
>
> Could this be a method instead of a macro? Macros are evil!
Not easily, because it has a |NS_ENSURE_SUCCESS| embedded in it. If it helps, variants on that macro appear in several other places.
> The placement of the creation/destruction of the reporter in
> register/forgoetJSRuntime seems a little off to me. In a browser without
> XPConnect (which happens in tests for reasons I don't entirely fathom) we'll
> end up leaking the reporter.
Until this patch we never unregistered the reporter, so we would have always leaked it...
> Can they go in nsCycleCollector_startup/nsCycleCollector_shutdown instead?
... sure.
Comment 4•13 years ago
|
||
Ah, right. We'll have a dangling pointer, not a leak. ;)
| Assignee | ||
Comment 5•13 years ago
|
||
Comment 6•13 years ago
|
||
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla19
You need to log in
before you can comment on or make changes to this bug.
Description
•