author | Andrew McCreight <continuation@gmail.com> |
Sun, 04 Jan 2015 17:46:49 -0800 | |
changeset 221966 | d7405ceb19a2bc3eb893a18a8aafcbfd6232ab7c |
parent 221965 | 95bf6a77e0c68ad21f7e38539860783bc201cce1 |
child 221967 | ca77252e50dd3a5dd793993c485bdf4b9b1c6176 |
push id | 28052 |
push user | cbook@mozilla.com |
push date | Mon, 05 Jan 2015 11:04:26 +0000 |
treeherder | mozilla-central@b9f40d0310d5 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | smaug |
bugs | 1088268 |
milestone | 37.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -2329,96 +2329,114 @@ NotifyGCEndRunnable::Run() return NS_OK; } static void DOMGCSliceCallback(JSRuntime *aRt, JS::GCProgress aProgress, const JS::GCDescription &aDesc) { NS_ASSERTION(NS_IsMainThread(), "GCs must run on the main thread"); - if (aProgress == JS::GC_CYCLE_END) { - PRTime delta = GetCollectionTimeDelta(); - - if (sPostGCEventsToConsole) { - NS_NAMED_LITERAL_STRING(kFmt, "GC(T+%.1f) "); - nsString prefix, gcstats; - gcstats.Adopt(aDesc.formatMessage(aRt)); - prefix.Adopt(nsTextFormatter::smprintf(kFmt.get(), - double(delta) / PR_USEC_PER_SEC)); - nsString msg = prefix + gcstats; - nsCOMPtr<nsIConsoleService> cs = do_GetService(NS_CONSOLESERVICE_CONTRACTID); - if (cs) { - cs->LogStringMessage(msg.get()); - } + switch (aProgress) { + case JS::GC_CYCLE_BEGIN: { + // Prevent cycle collections and shrinking during incremental GC. + sCCLockedOut = true; + + nsJSContext::KillShrinkGCBuffersTimer(); + + break; } - if (sPostGCEventsToObserver) { - nsString json; - json.Adopt(aDesc.formatJSON(aRt, PR_Now())); - nsRefPtr<NotifyGCEndRunnable> notify = new NotifyGCEndRunnable(json); - NS_DispatchToMainThread(notify); + case JS::GC_CYCLE_END: { + PRTime delta = GetCollectionTimeDelta(); + + if (sPostGCEventsToConsole) { + NS_NAMED_LITERAL_STRING(kFmt, "GC(T+%.1f) "); + nsString prefix, gcstats; + gcstats.Adopt(aDesc.formatMessage(aRt)); + prefix.Adopt(nsTextFormatter::smprintf(kFmt.get(), + double(delta) / PR_USEC_PER_SEC)); + nsString msg = prefix + gcstats; + nsCOMPtr<nsIConsoleService> cs = do_GetService(NS_CONSOLESERVICE_CONTRACTID); + if (cs) { + cs->LogStringMessage(msg.get()); + } + } + + if (sPostGCEventsToObserver) { + nsString json; + json.Adopt(aDesc.formatJSON(aRt, PR_Now())); + nsRefPtr<NotifyGCEndRunnable> notify = new NotifyGCEndRunnable(json); + NS_DispatchToMainThread(notify); + } + + sCCLockedOut = false; + + // May need to kill the inter-slice GC timer + nsJSContext::KillInterSliceGCTimer(); + + sCCollectedWaitingForGC = 0; + sCCollectedZonesWaitingForGC = 0; + sLikelyShortLivingObjectsNeedingGC = 0; + sCleanupsSinceLastGC = 0; + sNeedsFullCC = true; + sHasRunGC = true; + nsJSContext::MaybePokeCC(); + + if (aDesc.isCompartment_) { + if (!sFullGCTimer && !sShuttingDown) { + CallCreateInstance("@mozilla.org/timer;1", &sFullGCTimer); + sFullGCTimer->InitWithFuncCallback(FullGCTimerFired, + nullptr, + NS_FULL_GC_DELAY, + nsITimer::TYPE_ONE_SHOT); + } + } else { + nsJSContext::KillFullGCTimer(); + + // Avoid shrinking during heavy activity, which is suggested by + // compartment GC. + nsJSContext::PokeShrinkGCBuffers(); + } + + if (ShouldTriggerCC(nsCycleCollector_suspectedCount())) { + nsCycleCollector_dispatchDeferredDeletion(); + } + + break; } - } - - // Prevent cycle collections and shrinking during incremental GC. - if (aProgress == JS::GC_CYCLE_BEGIN) { - sCCLockedOut = true; - nsJSContext::KillShrinkGCBuffersTimer(); - } else if (aProgress == JS::GC_CYCLE_END) { - sCCLockedOut = false; + + case JS::GC_SLICE_BEGIN: + break; + + case JS::GC_SLICE_END: + + // The GC has more work to do, so schedule another GC slice. + nsJSContext::KillInterSliceGCTimer(); + if (!sShuttingDown) { + CallCreateInstance("@mozilla.org/timer;1", &sInterSliceGCTimer); + sInterSliceGCTimer->InitWithFuncCallback(InterSliceGCTimerFired, + nullptr, + NS_INTERSLICE_GC_DELAY, + nsITimer::TYPE_ONE_SHOT); + } + + if (ShouldTriggerCC(nsCycleCollector_suspectedCount())) { + nsCycleCollector_dispatchDeferredDeletion(); + } + + break; + + default: + MOZ_CRASH("Unexpected GCProgress value"); } - // The GC has more work to do, so schedule another GC slice. - if (aProgress == JS::GC_SLICE_END) { - nsJSContext::KillInterSliceGCTimer(); - if (!sShuttingDown) { - CallCreateInstance("@mozilla.org/timer;1", &sInterSliceGCTimer); - sInterSliceGCTimer->InitWithFuncCallback(InterSliceGCTimerFired, - nullptr, - NS_INTERSLICE_GC_DELAY, - nsITimer::TYPE_ONE_SHOT); - } + if (sPrevGCSliceCallback) { + (*sPrevGCSliceCallback)(aRt, aProgress, aDesc); } - if (aProgress == JS::GC_CYCLE_END) { - // May need to kill the inter-slice GC timer - nsJSContext::KillInterSliceGCTimer(); - - sCCollectedWaitingForGC = 0; - sCCollectedZonesWaitingForGC = 0; - sLikelyShortLivingObjectsNeedingGC = 0; - sCleanupsSinceLastGC = 0; - sNeedsFullCC = true; - sHasRunGC = true; - nsJSContext::MaybePokeCC(); - - if (aDesc.isCompartment_) { - if (!sFullGCTimer && !sShuttingDown) { - CallCreateInstance("@mozilla.org/timer;1", &sFullGCTimer); - sFullGCTimer->InitWithFuncCallback(FullGCTimerFired, - nullptr, - NS_FULL_GC_DELAY, - nsITimer::TYPE_ONE_SHOT); - } - } else { - nsJSContext::KillFullGCTimer(); - - // Avoid shrinking during heavy activity, which is suggested by - // compartment GC. - nsJSContext::PokeShrinkGCBuffers(); - } - } - - if ((aProgress == JS::GC_SLICE_END || aProgress == JS::GC_CYCLE_END) && - ShouldTriggerCC(nsCycleCollector_suspectedCount())) { - nsCycleCollector_dispatchDeferredDeletion(); - } - - if (sPrevGCSliceCallback) - (*sPrevGCSliceCallback)(aRt, aProgress, aDesc); } void nsJSContext::SetWindowProxy(JS::Handle<JSObject*> aWindowProxy) { mWindowProxy = aWindowProxy; }