Bug 751561 - Call forgetSkippable at least twice before CC, r=mccr8

--HG--
extra : rebase_source : 7434eb9be0bbdfd7fe44e1aeced9698d6c0627e1
This commit is contained in:
Olli Pettay 2012-05-03 19:17:01 +03:00
Родитель 303401cb6f
Коммит f4603a370b
3 изменённых файлов: 16 добавлений и 13 удалений

Просмотреть файл

@ -317,7 +317,7 @@ nsCCUncollectableMarker::Observe(nsISupports* aSubject, const char* aTopic,
// JS cleanup can be slow. Do it only if there has been a GC.
bool cleanupJS =
!nsJSContext::CleanupSinceLastGC() &&
nsJSContext::CleanupsSinceLastGC() == 0 &&
!strcmp(aTopic, "cycle-collector-forget-skippable");
bool prepareForCC = !strcmp(aTopic, "cycle-collector-begin");

Просмотреть файл

@ -186,7 +186,7 @@ static PRUint32 sRemovedPurples = 0;
static PRUint32 sForgetSkippableBeforeCC = 0;
static PRUint32 sPreviousSuspectedCount = 0;
static bool sCleanupSinceLastGC = true;
static PRUint32 sCleanupsSinceLastGC = PR_UINT32_MAX;
static bool sNeedsFullCC = false;
nsScriptNameSpaceManager *gNameSpaceManager;
@ -2951,14 +2951,18 @@ nsJSContext::CycleCollectNow(nsICycleCollectorListener *aListener,
PRUint32 suspected = nsCycleCollector_suspectedCount();
for (PRInt32 i = 0; i < aExtraForgetSkippableCalls; ++i) {
nsCycleCollector_forgetSkippable();
// nsCycleCollector_forgetSkippable may mark some gray js to black.
if (sCleanupsSinceLastGC < 2 && aExtraForgetSkippableCalls >= 0) {
for (;sCleanupsSinceLastGC < 2; ++sCleanupsSinceLastGC) {
nsCycleCollector_forgetSkippable();
}
}
// nsCycleCollector_forgetSkippable may mark some gray js to black.
if (!sCleanupSinceLastGC && aExtraForgetSkippableCalls >= 0) {
for (PRInt32 i = 0; i < aExtraForgetSkippableCalls; ++i) {
nsCycleCollector_forgetSkippable();
++sCleanupsSinceLastGC;
}
nsCycleCollectorResults ccResults;
nsCycleCollector_collect(&ccResults, aListener);
sCCollectedWaitingForGC += ccResults.mFreedRefCounted + ccResults.mFreedGCed;
@ -3062,7 +3066,6 @@ nsJSContext::CycleCollectNow(nsICycleCollectorListener *aListener,
sTotalForgetSkippableTime = 0;
sRemovedPurples = 0;
sForgetSkippableBeforeCC = 0;
sCleanupSinceLastGC = true;
sNeedsFullCC = false;
}
@ -3098,7 +3101,7 @@ TimerFireForgetSkippable(PRUint32 aSuspected, bool aRemoveChildless)
PRTime startTime = PR_Now();
nsCycleCollector_forgetSkippable(aRemoveChildless);
sPreviousSuspectedCount = nsCycleCollector_suspectedCount();
sCleanupSinceLastGC = true;
++sCleanupsSinceLastGC;
PRTime delta = PR_Now() - startTime;
if (sMinForgetSkippableTime > delta) {
sMinForgetSkippableTime = delta;
@ -3167,10 +3170,10 @@ CCTimerFired(nsITimer *aTimer, void *aClosure)
}
// static
bool
nsJSContext::CleanupSinceLastGC()
PRUint32
nsJSContext::CleanupsSinceLastGC()
{
return sCleanupSinceLastGC;
return sCleanupsSinceLastGC;
}
// static
@ -3389,7 +3392,7 @@ DOMGCSliceCallback(JSRuntime *aRt, js::GCProgress aProgress, const js::GCDescrip
nsJSContext::KillGCTimer();
sCCollectedWaitingForGC = 0;
sCleanupSinceLastGC = false;
sCleanupsSinceLastGC = 0;
if (aDesc.isCompartment) {
// If this is a compartment GC, restart it. We still want

Просмотреть файл

@ -202,7 +202,7 @@ public:
virtual void GC(js::gcreason::Reason aReason);
static bool CleanupSinceLastGC();
static PRUint32 CleanupsSinceLastGC();
nsIScriptGlobalObject* GetCachedGlobalObject()
{