Closed
Bug 390314
Opened 17 years ago
Closed 17 years ago
ActionMonkey: Make sure js_TraceRuntime is called from MMgc
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: jorendorff, Assigned: jorendorff)
References
Details
Attachments
(1 file, 5 obsolete files)
(deleted),
patch
|
brendan
:
review+
|
Details | Diff | Splinter Review |
I think the way to do this is to make JSRuntime derive from MMgc::GCFinalizedObject (or maybe JSFinalizedGCThing) rather than MMgc::GCRoot, and give it its own CustomMark() method that calls js_TraceRuntime().
Of course this means we need an MMgc::GCRoot somewhere, and I think the answer for that is to create a custom class JSRuntimeGCRoot : public MMgc::GCRoot and have it and the JSRuntime point to each other.
Assignee | ||
Updated•17 years ago
|
Status: NEW → ASSIGNED
Comment 1•17 years ago
|
||
Why not MI? Why make an extra object/allocation if you don't need one?
/be
Comment 2•17 years ago
|
||
- should probably assert that we do have a tracer//
- js_TraceRuntime is supposed to be called with true if it's GC_LAST_DITCH..
- no need to delete the JSRuntime in Destroy -- it's gc managed
- jscntxt.cpp the place for defining JSRuntime methods?
Assignee | ||
Comment 3•17 years ago
|
||
(In reply to comment #1)
> Why not MI? Why make an extra object/allocation if you don't need one?
Can I depend on the compiler to lay out the first base class at
offset 0? MMgc requires the GCFinalizedObject vptr to be at offset 0.
Either way, I think I can avoid the extra allocation somehow.
Comment 4•17 years ago
|
||
Left-most direct inherited real base first, AFAIK on all platforms we care about.
Is there a bug requesting that MMgc deal with inner-object pointers?
/be
Assignee | ||
Comment 5•17 years ago
|
||
Because we're using conservative GC, some JSObjects may be left over for JS_DestroyRuntime(). There is no way to prevent this. Those objects' finalizers will be called; MMgc::GC::~GC does this for all remaining kFinalize objects; it would be a hack to prevent this.
I think those finalizers must happen *before* the JSRuntime itself is destroyed; therefore the JSRuntime itself must not be GC-allocated. It must be destroyed after the GC is torn down.
Since JSRuntime can't be GC-allocated, it can't have a CustomMark() method. So we introduce a separate object, JSRuntimeGCMarker, that is GC-allocated and exists solely so that it's CustomMark() method can call JS_TraceRuntime(). We also have a GCRoot that roots the gcMarker.
This patch aims to get the order of setup and teardown right. JSRuntime creation looks like this:
1 - Allocate and set up JSRuntime.
2 - Create the MMgc::GC object.
3 - Create the JSRuntimeGCMarker object (gc-allocated).
4 - Create the GCRoot to root the JSRuntimeGCMarker.
Destruction is the same thing in reverse:
4 - Destroy the GCRoot.
3 - (no-op, we'll let the JSRuntimeGCMarker be gc'd)
2 - Destroy the MMgc::GC object.
1 - Tear down and deallocate JSRuntime.
The patch moves GC initialization after lock initialization, for symmetry. GC init/finish stuff that had crept into jsapi.cpp has been moved into js_InitGC()/js_FinishGC().
As Mardak mentioned above, js_TraceRuntime must be called with allAtoms=true if the collection is GC_LAST_DITCH. This patch does this by wrapping most of the body of js_GC() in a JS_{KEEP/UNKEEP}_ATOMS pair. Then allAtoms does not need to be explicitly passed to js_TraceRuntime; it can just test the rc->gcKeepAtoms field directly. This leads to some other simplifications.
This can be simplified to get rid of one or two malloc()s, but it would require a pretty big rewrite. The nice thing about |new| is that it lets you initialize things whenever and from wherever you want. It'll do for today. Tomorrow, RAII ftw.
Assignee: general → jorendorff
Attachment #274727 -
Flags: review?(brendan)
Assignee | ||
Comment 6•17 years ago
|
||
js/tests pass with the new patch.
Assignee | ||
Comment 7•17 years ago
|
||
Comment on attachment 274727 [details] [diff] [review]
another stab
This patch is ugly. Hang on.
Attachment #274727 -
Flags: review?(brendan)
Comment 8•17 years ago
|
||
Should keep Igor in the loop here.
/be
Assignee | ||
Comment 9•17 years ago
|
||
OK, this is a little nicer. gcRunning, instead of being a boolean, becomes a GCInvocationKind. Fewer pointless edits in js_GC().
Attachment #274653 -
Attachment is obsolete: true
Attachment #274727 -
Attachment is obsolete: true
Attachment #274830 -
Flags: review?(brendan)
Updated•17 years ago
|
Attachment #274830 -
Attachment is patch: true
Attachment #274830 -
Attachment mime type: application/octet-stream → text/plain
Comment 10•17 years ago
|
||
(In reply to comment #9)
> Created an attachment (id=274830) [details]
> v3
>
> OK, this is a little nicer. gcRunning, instead of being a boolean, becomes a
> GCInvocationKind. Fewer pointless edits in js_GC().
Is the attached patch the one that goes with this comment? I see no gcRunning change. I have some review comments, but I'll hold them pending confirmation that this is the right patch.
/be
Comment 11•17 years ago
|
||
If that patch is for another bug, I'll gladly review over in that other bug.
/be
Assignee | ||
Comment 12•17 years ago
|
||
Brendan: You're right, that was the wrong patch entirely. This is the one.
Attachment #274830 -
Attachment is obsolete: true
Attachment #274830 -
Flags: review?(brendan)
Assignee | ||
Comment 13•17 years ago
|
||
(In reply to comment #11)
> If that patch is for another bug, I'll gladly review over in that other bug.
It was for bug 389420. Already checked in, but it's never too late for a review. Please do.
Assignee | ||
Updated•17 years ago
|
Attachment #274837 -
Flags: review?(brendan)
Assignee | ||
Comment 14•17 years ago
|
||
Mostly just refreshing the patch. Plus:
- JSRuntimeGCMarker::CustomMark now calls js_MarkScriptFilenames and ScanDelayedChildren. It's important; the point of the bug is to get that stuff out of js_GC and into a spot where MMgc will call them.
- Now js_GC calls JSRuntimeGCMarker::CustomMark (instead of calling js_TraceRuntime directly), so it's actually exercised. Tests pass.
Attachment #274837 -
Attachment is obsolete: true
Attachment #275432 -
Flags: review?(brendan)
Attachment #274837 -
Flags: review?(brendan)
Comment 15•17 years ago
|
||
Comment on attachment 275432 [details] [diff] [review]
v4
>- if (!js_InitGC(rt, maxbytes))
>- goto bad;
Sorry, can you remind me why this moved down?
>-}
>-
>-JS_PUBLIC_API(void)
>-JS_TraceRuntime(JSTracer *trc)
>-{
>- JSBool allAtoms = trc->context->runtime->gcKeepAtoms != 0;
>-
>- js_TraceRuntime(trc, allAtoms);
> }
Please keep API entry points in jsapi.c as much as possible. Only recent changes put a few new APIs (and moved one or two old ones, IIRC) to jsgc.c. This one can stay here.
>-void
>-js_TraceRuntime(JSTracer *trc, JSBool allAtoms)
>+JS_PUBLIC_API(void)
>+JS_TraceRuntime(JSTracer *trc)
> {
> JSRuntime *rt = trc->context->runtime;
>+ JSBool allAtoms = JS_GC_KEEP_ATOMS(rt);
No need for single-use variable, and indeed since you eliminated js_MarkScriptFilenames' keepAtoms param, you might do the same for js_TraceLockedAtoms (have it test GC_KEEP_ATOMS(rt)) -- or at a minimum just get rid of allAtoms here.
>+/* Tracing routines may use this to determine whether to mark all atoms. */
>+#define JS_GC_KEEP_ATOMS(rt) ((rt)->gcRunning == GC_LAST_DITCH \
>+ || (rt)->gcKeepAtoms != 0)
No need for JS_ prefix to this macro's name.
Nit: || at "end" of first line (not counting / +\\$/ of course).
>+js_MarkScriptFilenames(JSRuntime *rt)
>+{
>+ JSBool keepAtoms = JS_GC_KEEP_ATOMS(rt);
Ditto avoiding single-use variable nit.
/be
Assignee | ||
Comment 16•17 years ago
|
||
(In reply to comment #15)
> (From update of attachment 275432 [details] [diff] [review])
>
> >- if (!js_InitGC(rt, maxbytes))
> >- goto bad;
>
> Sorry, can you remind me why this moved down?
Symmetry with JS_DestroyRuntime. Members should be torn down in the opposite order they're built up. We want to be moving in the direction of RAII. I think the change fits in this patch because this is all about setup/teardown timing. But it would work without this change.
> >-JS_PUBLIC_API(void)
> >-JS_TraceRuntime(JSTracer *trc)
> >-{
> >- JSBool allAtoms = trc->context->runtime->gcKeepAtoms != 0;
> >-
> >- js_TraceRuntime(trc, allAtoms);
> > }
>
> Please keep API entry points in jsapi.c as much as possible. Only recent
> changes put a few new APIs (and moved one or two old ones, IIRC) to jsgc.c.
> This one can stay here.
OK. Do you mean (a) keep JS_TraceRuntime as a trivial wrapper around js_TraceRuntime; or (b) move the body of js_TraceRuntime (and the 2 dhash-traversal callbacks, and whatever else they depend on) into jsapi.cpp?
I did (a) for this updated patch. (branch prediction :)
Attachment #275432 -
Attachment is obsolete: true
Attachment #275597 -
Flags: review?(brendan)
Attachment #275432 -
Flags: review?(brendan)
Assignee | ||
Updated•17 years ago
|
Comment 17•17 years ago
|
||
Comment on attachment 275597 [details] [diff] [review]
v4a - addressing brendan's comments
JS_TraceRuntime along with other API entry points should go in jsapi.c, after the other JS_*Runtime function definitions. r=me with that, thanks.
/be
Attachment #275597 -
Flags: review?(brendan) → review+
Assignee | ||
Updated•17 years ago
|
Status: ASSIGNED → RESOLVED
Closed: 17 years ago
Resolution: --- → FIXED
Updated•17 years ago
|
Flags: in-testsuite-
You need to log in
before you can comment on or make changes to this bug.
Description
•