Bug 742570 - Change API for compartment GCs (r=igor)

This commit is contained in:
Bill McCloskey 2012-04-03 12:23:11 -07:00
parent 3ace6566fe
commit 90e65d2fdb
9 changed files with 35 additions and 46 deletions

View File

@ -3891,6 +3891,7 @@ WorkerPrivate::GarbageCollectInternal(JSContext* aCx, bool aShrinking,
{ {
AssertIsOnWorkerThread(); AssertIsOnWorkerThread();
js::PrepareForFullGC(JS_GetRuntime(aCx));
if (aShrinking) { if (aShrinking) {
js::ShrinkingGC(aCx, js::gcreason::DOM_WORKER); js::ShrinkingGC(aCx, js::gcreason::DOM_WORKER);
} }

View File

@ -32,7 +32,11 @@ GC(JSContext *cx, unsigned argc, jsval *vp)
size_t preBytes = cx->runtime->gcBytes; size_t preBytes = cx->runtime->gcBytes;
#endif #endif
JS_CompartmentGC(cx, comp); if (comp)
PrepareCompartmentForGC(comp);
else
PrepareForFullGC(cx->runtime);
GCForReason(cx, gcreason::API);
char buf[256] = { '\0' }; char buf[256] = { '\0' };
#ifndef JS_MORE_DETERMINISTIC #ifndef JS_MORE_DETERMINISTIC

View File

@ -2859,27 +2859,12 @@ JS_IsGCMarkingTracer(JSTracer *trc)
return IS_GC_MARKING_TRACER(trc); return IS_GC_MARKING_TRACER(trc);
} }
extern JS_PUBLIC_API(void)
JS_CompartmentGC(JSContext *cx, JSCompartment *comp)
{
AssertNoGC(cx);
/* We cannot GC the atoms compartment alone; use a full GC instead. */
JS_ASSERT(comp != cx->runtime->atomsCompartment);
if (comp) {
PrepareCompartmentForGC(comp);
GC(cx, GC_NORMAL, gcreason::API);
} else {
PrepareForFullGC(cx->runtime);
GC(cx, GC_NORMAL, gcreason::API);
}
}
JS_PUBLIC_API(void) JS_PUBLIC_API(void)
JS_GC(JSContext *cx) JS_GC(JSContext *cx)
{ {
JS_CompartmentGC(cx, NULL); AssertNoGC(cx);
PrepareForFullGC(cx->runtime);
GC(cx, GC_NORMAL, gcreason::API);
} }
JS_PUBLIC_API(void) JS_PUBLIC_API(void)

View File

@ -132,33 +132,33 @@ JS_NewObjectWithUniqueType(JSContext *cx, JSClass *clasp, JSObject *proto, JSObj
} }
JS_FRIEND_API(void) JS_FRIEND_API(void)
js::GCForReason(JSContext *cx, gcreason::Reason reason) js::PrepareCompartmentForGC(JSCompartment *comp)
{ {
PrepareForFullGC(cx->runtime); comp->scheduleGC();
GC(cx, GC_NORMAL, reason);
} }
JS_FRIEND_API(void) JS_FRIEND_API(void)
js::CompartmentGCForReason(JSContext *cx, JSCompartment *comp, gcreason::Reason reason) js::PrepareForFullGC(JSRuntime *rt)
{ {
/* We cannot GC the atoms compartment alone; use a full GC instead. */ for (CompartmentsIter c(rt); !c.done(); c.next())
JS_ASSERT(comp != cx->runtime->atomsCompartment); c->scheduleGC();
}
PrepareCompartmentForGC(comp); JS_FRIEND_API(void)
js::GCForReason(JSContext *cx, gcreason::Reason reason)
{
GC(cx, GC_NORMAL, reason); GC(cx, GC_NORMAL, reason);
} }
JS_FRIEND_API(void) JS_FRIEND_API(void)
js::ShrinkingGC(JSContext *cx, gcreason::Reason reason) js::ShrinkingGC(JSContext *cx, gcreason::Reason reason)
{ {
PrepareForFullGC(cx->runtime);
GC(cx, GC_SHRINK, reason); GC(cx, GC_SHRINK, reason);
} }
JS_FRIEND_API(void) JS_FRIEND_API(void)
js::IncrementalGC(JSContext *cx, gcreason::Reason reason) js::IncrementalGC(JSContext *cx, gcreason::Reason reason)
{ {
PrepareForFullGC(cx->runtime);
GCSlice(cx, GC_NORMAL, reason); GCSlice(cx, GC_NORMAL, reason);
} }

View File

@ -667,10 +667,20 @@ enum Reason {
} /* namespace gcreason */ } /* namespace gcreason */
extern JS_FRIEND_API(void) extern JS_FRIEND_API(void)
GCForReason(JSContext *cx, gcreason::Reason reason); PrepareCompartmentForGC(JSCompartment *comp);
extern JS_FRIEND_API(void) extern JS_FRIEND_API(void)
CompartmentGCForReason(JSContext *cx, JSCompartment *comp, gcreason::Reason reason); PrepareForFullGC(JSRuntime *rt);
/*
* When triggering a GC using one of the functions below, it is first necessary
* to select the compartments to be collected. To do this, you can call
* PrepareCompartmentForGC on each compartment, or you can call PrepareForFullGC
* to select all compartments. Failing to select any compartment is an error.
*/
extern JS_FRIEND_API(void)
GCForReason(JSContext *cx, gcreason::Reason reason);
extern JS_FRIEND_API(void) extern JS_FRIEND_API(void)
ShrinkingGC(JSContext *cx, gcreason::Reason reason); ShrinkingGC(JSContext *cx, gcreason::Reason reason);

View File

@ -2824,19 +2824,6 @@ GCHelperThread::doSweep()
#endif /* JS_THREADSAFE */ #endif /* JS_THREADSAFE */
void
PrepareForFullGC(JSRuntime *rt)
{
for (CompartmentsIter c(rt); !c.done(); c.next())
c->scheduleGC();
}
void
PrepareCompartmentForGC(JSCompartment *comp)
{
comp->scheduleGC();
}
} /* namespace js */ } /* namespace js */
static bool static bool

View File

@ -1386,9 +1386,6 @@ ShrinkGCBuffers(JSRuntime *rt);
extern void extern void
PrepareForFullGC(JSRuntime *rt); PrepareForFullGC(JSRuntime *rt);
extern void
PrepareCompartmentForGC(JSCompartment *comp);
/* /*
* Kinds of js_GC invocation. * Kinds of js_GC invocation.
*/ */

View File

@ -3620,6 +3620,7 @@ nsXPCComponents_Utils::GetWeakReference(const JS::Value &object, JSContext *cx,
NS_IMETHODIMP NS_IMETHODIMP
nsXPCComponents_Utils::ForceGC(JSContext *cx) nsXPCComponents_Utils::ForceGC(JSContext *cx)
{ {
js::PrepareForFullGC(JS_GetRuntime(cx));
js::GCForReason(cx, js::gcreason::COMPONENT_UTILS); js::GCForReason(cx, js::gcreason::COMPONENT_UTILS);
return NS_OK; return NS_OK;
} }
@ -3628,6 +3629,7 @@ nsXPCComponents_Utils::ForceGC(JSContext *cx)
NS_IMETHODIMP NS_IMETHODIMP
nsXPCComponents_Utils::ForceShrinkingGC(JSContext *cx) nsXPCComponents_Utils::ForceShrinkingGC(JSContext *cx)
{ {
js::PrepareForFullGC(JS_GetRuntime(cx));
js::ShrinkingGC(cx, js::gcreason::COMPONENT_UTILS); js::ShrinkingGC(cx, js::gcreason::COMPONENT_UTILS);
return NS_OK; return NS_OK;
} }
@ -3655,6 +3657,7 @@ class PreciseGCRunnable : public nsRunnable
} }
} }
js::PrepareForFullGC(JS_GetRuntime(mCx));
if (mShrinking) if (mShrinking)
js::ShrinkingGC(mCx, js::gcreason::COMPONENT_UTILS); js::ShrinkingGC(mCx, js::gcreason::COMPONENT_UTILS);
else else

View File

@ -414,6 +414,7 @@ nsXPConnect::Collect(PRUint32 reason, PRUint32 kind)
return; return;
JSContext *cx = ccx.GetJSContext(); JSContext *cx = ccx.GetJSContext();
JSRuntime *rt = GetRuntime()->GetJSRuntime();
// We want to scan the current thread for GC roots only if it was in a // We want to scan the current thread for GC roots only if it was in a
// request prior to the Collect call to avoid false positives during the // request prior to the Collect call to avoid false positives during the
@ -423,6 +424,7 @@ nsXPConnect::Collect(PRUint32 reason, PRUint32 kind)
js::AutoSkipConservativeScan ascs(cx); js::AutoSkipConservativeScan ascs(cx);
MOZ_ASSERT(reason < js::gcreason::NUM_REASONS); MOZ_ASSERT(reason < js::gcreason::NUM_REASONS);
js::gcreason::Reason gcreason = (js::gcreason::Reason)reason; js::gcreason::Reason gcreason = (js::gcreason::Reason)reason;
js::PrepareForFullGC(rt);
if (kind == nsGCShrinking) { if (kind == nsGCShrinking) {
js::ShrinkingGC(cx, gcreason); js::ShrinkingGC(cx, gcreason);
} else if (kind == nsGCIncremental) { } else if (kind == nsGCIncremental) {