mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1052793, part 1 - Do per-zone GC for CC_WAITING triggers. r=smaug
This commit is contained in:
parent
479689dd15
commit
4098d0b694
@ -178,6 +178,7 @@ static uint32_t sForgetSkippableBeforeCC = 0;
|
||||
static uint32_t sPreviousSuspectedCount = 0;
|
||||
static uint32_t sCleanupsSinceLastGC = UINT32_MAX;
|
||||
static bool sNeedsFullCC = false;
|
||||
static bool sNeedsFullGC = false;
|
||||
static bool sNeedsGCAfterCC = false;
|
||||
static bool sIncrementalCC = false;
|
||||
static bool sDidPaintAfterPreviousICCSlice = false;
|
||||
@ -1312,7 +1313,14 @@ nsJSContext::GarbageCollectNow(JS::gcreason::Reason aReason,
|
||||
}
|
||||
|
||||
JSGCInvocationKind gckind = aShrinking == ShrinkingGC ? GC_SHRINK : GC_NORMAL;
|
||||
|
||||
if (sNeedsFullGC || aReason != JS::gcreason::CC_WAITING) {
|
||||
sNeedsFullGC = false;
|
||||
JS::PrepareForFullGC(sRuntime);
|
||||
} else {
|
||||
CycleCollectedJSRuntime::Get()->PrepareWaitingZonesForGC();
|
||||
}
|
||||
|
||||
if (aIncremental == IncrementalGC) {
|
||||
JS::StartIncrementalGC(sRuntime, gckind, aReason, aSliceMillis);
|
||||
} else {
|
||||
@ -2009,6 +2017,8 @@ nsJSContext::RunNextCollectorTimer()
|
||||
void
|
||||
nsJSContext::PokeGC(JS::gcreason::Reason aReason, int aDelay)
|
||||
{
|
||||
sNeedsFullGC = sNeedsFullGC || aReason != JS::gcreason::CC_WAITING;
|
||||
|
||||
if (sGCTimer || sInterSliceGCTimer || sShuttingDown) {
|
||||
// There's already a timer for GC'ing, just return
|
||||
return;
|
||||
@ -2380,6 +2390,7 @@ mozilla::dom::StartupJSEnvironment()
|
||||
sLikelyShortLivingObjectsNeedingGC = 0;
|
||||
sPostGCEventsToConsole = false;
|
||||
sNeedsFullCC = false;
|
||||
sNeedsFullGC = false;
|
||||
sNeedsGCAfterCC = false;
|
||||
gNameSpaceManager = nullptr;
|
||||
sRuntime = nullptr;
|
||||
|
@ -1557,6 +1557,7 @@ CycleCollectedJSRuntime::OnGC(JSGCStatus aStatus)
|
||||
switch (aStatus) {
|
||||
case JSGC_BEGIN:
|
||||
nsCycleCollector_prepareForGarbageCollection();
|
||||
mZonesWaitingForGC.Clear();
|
||||
break;
|
||||
case JSGC_END: {
|
||||
#ifdef MOZ_CRASHREPORTER
|
||||
@ -1599,3 +1600,16 @@ CycleCollectedJSRuntime::OnLargeAllocationFailure()
|
||||
CustomLargeAllocationFailureCallback();
|
||||
AnnotateAndSetOutOfMemory(&mLargeAllocationFailureState, OOMState::Reported);
|
||||
}
|
||||
|
||||
void
|
||||
CycleCollectedJSRuntime::PrepareWaitingZonesForGC()
|
||||
{
|
||||
if (mZonesWaitingForGC.Count() == 0) {
|
||||
JS::PrepareForFullGC(Runtime());
|
||||
} else {
|
||||
for (auto iter = mZonesWaitingForGC.Iter(); !iter.Done(); iter.Next()) {
|
||||
JS::PrepareZoneForGC(iter.Get()->GetKey());
|
||||
}
|
||||
mZonesWaitingForGC.Clear();
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "nsDataHashtable.h"
|
||||
#include "nsHashKeys.h"
|
||||
#include "nsTArray.h"
|
||||
#include "nsTHashtable.h"
|
||||
|
||||
class nsCycleCollectionNoteRootCallback;
|
||||
class nsIException;
|
||||
@ -334,6 +335,18 @@ public:
|
||||
// isn't one.
|
||||
static CycleCollectedJSRuntime* Get();
|
||||
|
||||
// Add aZone to the set of zones waiting for a GC.
|
||||
void AddZoneWaitingForGC(JS::Zone* aZone)
|
||||
{
|
||||
mZonesWaitingForGC.PutEntry(aZone);
|
||||
}
|
||||
|
||||
// Prepare any zones for GC that have been passed to AddZoneWaitingForGC()
|
||||
// since the last GC or since the last call to PrepareWaitingZonesForGC(),
|
||||
// whichever was most recent. If there were no such zones, prepare for a
|
||||
// full GC.
|
||||
void PrepareWaitingZonesForGC();
|
||||
|
||||
// Storage for watching rejected promises waiting for some client to
|
||||
// consume their rejection.
|
||||
// We store values as `nsISupports` to avoid adding compile-time dependencies
|
||||
@ -386,6 +399,8 @@ private:
|
||||
SegmentedVector<JS::PersistentRooted<JSObject*>, kSegmentSize,
|
||||
InfallibleAllocPolicy>
|
||||
mPreservedNurseryObjects;
|
||||
|
||||
nsTHashtable<nsPtrHashKey<JS::Zone>> mZonesWaitingForGC;
|
||||
};
|
||||
|
||||
void TraceScriptHolder(nsISupports* aHolder, JSTracer* aTracer);
|
||||
|
@ -3265,9 +3265,15 @@ nsCycleCollector::CollectWhite()
|
||||
if (pinfo->mColor == white && pinfo->mParticipant) {
|
||||
if (pinfo->IsGrayJS()) {
|
||||
++numWhiteGCed;
|
||||
JS::Zone* zone;
|
||||
if (MOZ_UNLIKELY(pinfo->mParticipant == zoneParticipant)) {
|
||||
++numWhiteJSZones;
|
||||
zone = static_cast<JS::Zone*>(pinfo->mPointer);
|
||||
} else {
|
||||
JS::GCCellPtr ptr(pinfo->mPointer, js::GCThingTraceKind(pinfo->mPointer));
|
||||
zone = JS::GetTenuredGCThingZone(ptr);
|
||||
}
|
||||
mJSRuntime->AddZoneWaitingForGC(zone);
|
||||
} else {
|
||||
whiteNodes.InfallibleAppend(pinfo);
|
||||
pinfo->mParticipant->Root(pinfo->mPointer);
|
||||
|
Loading…
Reference in New Issue
Block a user