mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Backed out changesets b03bd1170d1c, 419615a1195d, a1b699b80442, and 524c573fd8a6 (bug 937960) for Win7 debug xpcshell orange.
This commit is contained in:
parent
93604b8dd2
commit
2d5b945f2d
@ -121,15 +121,6 @@ static PRLogModuleInfo* gJSDiagnostics;
|
|||||||
|
|
||||||
#define NS_CC_SKIPPABLE_DELAY 400 // ms
|
#define NS_CC_SKIPPABLE_DELAY 400 // ms
|
||||||
|
|
||||||
// Maximum amount of time that should elapse between incremental CC slices
|
|
||||||
static const int64_t kICCIntersliceDelay = 32; // ms
|
|
||||||
|
|
||||||
// Time budget for an incremental CC slice
|
|
||||||
static const int64_t kICCSliceBudget = 10; // ms
|
|
||||||
|
|
||||||
// Maximum total duration for an ICC
|
|
||||||
static const uint32_t kMaxICCDuration = 2000; // ms
|
|
||||||
|
|
||||||
// Force a CC after this long if there's more than NS_CC_FORCED_PURPLE_LIMIT
|
// Force a CC after this long if there's more than NS_CC_FORCED_PURPLE_LIMIT
|
||||||
// objects in the purple buffer.
|
// objects in the purple buffer.
|
||||||
#define NS_CC_FORCED (2 * 60 * PR_USEC_PER_SEC) // 2 min
|
#define NS_CC_FORCED (2 * 60 * PR_USEC_PER_SEC) // 2 min
|
||||||
@ -153,7 +144,6 @@ static const uint32_t kMaxICCDuration = 2000; // ms
|
|||||||
static nsITimer *sGCTimer;
|
static nsITimer *sGCTimer;
|
||||||
static nsITimer *sShrinkGCBuffersTimer;
|
static nsITimer *sShrinkGCBuffersTimer;
|
||||||
static nsITimer *sCCTimer;
|
static nsITimer *sCCTimer;
|
||||||
static nsITimer *sICCTimer;
|
|
||||||
static nsITimer *sFullGCTimer;
|
static nsITimer *sFullGCTimer;
|
||||||
static nsITimer *sInterSliceGCTimer;
|
static nsITimer *sInterSliceGCTimer;
|
||||||
|
|
||||||
@ -190,7 +180,6 @@ static uint32_t sCleanupsSinceLastGC = UINT32_MAX;
|
|||||||
static bool sNeedsFullCC = false;
|
static bool sNeedsFullCC = false;
|
||||||
static bool sNeedsGCAfterCC = false;
|
static bool sNeedsGCAfterCC = false;
|
||||||
static nsJSContext *sContextList = nullptr;
|
static nsJSContext *sContextList = nullptr;
|
||||||
static bool sIncrementalCC = false;
|
|
||||||
|
|
||||||
static nsScriptNameSpaceManager *gNameSpaceManager;
|
static nsScriptNameSpaceManager *gNameSpaceManager;
|
||||||
|
|
||||||
@ -233,7 +222,6 @@ KillTimers()
|
|||||||
nsJSContext::KillGCTimer();
|
nsJSContext::KillGCTimer();
|
||||||
nsJSContext::KillShrinkGCBuffersTimer();
|
nsJSContext::KillShrinkGCBuffersTimer();
|
||||||
nsJSContext::KillCCTimer();
|
nsJSContext::KillCCTimer();
|
||||||
nsJSContext::KillICCTimer();
|
|
||||||
nsJSContext::KillFullGCTimer();
|
nsJSContext::KillFullGCTimer();
|
||||||
nsJSContext::KillInterSliceGCTimer();
|
nsJSContext::KillInterSliceGCTimer();
|
||||||
}
|
}
|
||||||
@ -2025,22 +2013,6 @@ struct CycleCollectorStats
|
|||||||
|
|
||||||
CycleCollectorStats gCCStats;
|
CycleCollectorStats gCCStats;
|
||||||
|
|
||||||
static int64_t
|
|
||||||
ICCSliceTime()
|
|
||||||
{
|
|
||||||
// If CC is not incremental, use an unlimited budget.
|
|
||||||
if (!sIncrementalCC) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If an ICC is in progress and is taking too long, finish it off.
|
|
||||||
if (gCCStats.mBeginTime != 0 &&
|
|
||||||
TimeBetween(gCCStats.mBeginTime, PR_Now()) >= kMaxICCDuration) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return kICCSliceBudget;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
PrepareForCycleCollection(int32_t aExtraForgetSkippableCalls = 0)
|
PrepareForCycleCollection(int32_t aExtraForgetSkippableCalls = 0)
|
||||||
@ -2098,42 +2070,15 @@ nsJSContext::CycleCollectNow(nsICycleCollectorListener *aListener,
|
|||||||
|
|
||||||
//static
|
//static
|
||||||
void
|
void
|
||||||
nsJSContext::ScheduledCycleCollectNow(int64_t aSliceTime)
|
nsJSContext::ScheduledCycleCollectNow()
|
||||||
{
|
{
|
||||||
if (!NS_IsMainThread()) {
|
if (!NS_IsMainThread()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PROFILER_LABEL("CC", "ScheduledCycleCollectNow");
|
PROFILER_LABEL("CC", "ScheduledCycleCollectNow");
|
||||||
|
|
||||||
// Ideally, the slice time would be decreased by the amount of
|
|
||||||
// time spent on PrepareForCycleCollection().
|
|
||||||
PrepareForCycleCollection();
|
PrepareForCycleCollection();
|
||||||
nsCycleCollector_scheduledCollect(aSliceTime);
|
nsCycleCollector_scheduledCollect();
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ICCTimerFired(nsITimer* aTimer, void* aClosure)
|
|
||||||
{
|
|
||||||
if (sDidShutdown) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore ICC timer fires during IGC. Running ICC during an IGC will cause us
|
|
||||||
// to synchronously finish the GC, which is bad.
|
|
||||||
|
|
||||||
if (sCCLockedOut) {
|
|
||||||
PRTime now = PR_Now();
|
|
||||||
if (sCCLockedOutTime == 0) {
|
|
||||||
sCCLockedOutTime = now;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (now - sCCLockedOutTime < NS_MAX_CC_LOCKEDOUT_TIME) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nsJSContext::ScheduledCycleCollectNow(ICCSliceTime());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
@ -2146,20 +2091,6 @@ nsJSContext::BeginCycleCollectionCallback()
|
|||||||
gCCStats.mSuspected = nsCycleCollector_suspectedCount();
|
gCCStats.mSuspected = nsCycleCollector_suspectedCount();
|
||||||
|
|
||||||
KillCCTimer();
|
KillCCTimer();
|
||||||
|
|
||||||
MOZ_ASSERT(!sICCTimer, "Tried to create a new ICC timer when one already existed.");
|
|
||||||
|
|
||||||
if (!sIncrementalCC) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CallCreateInstance("@mozilla.org/timer;1", &sICCTimer);
|
|
||||||
if (sICCTimer) {
|
|
||||||
sICCTimer->InitWithFuncCallback(ICCTimerFired,
|
|
||||||
nullptr,
|
|
||||||
kICCIntersliceDelay,
|
|
||||||
nsITimer::TYPE_REPEATING_SLACK);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
@ -2168,8 +2099,6 @@ nsJSContext::EndCycleCollectionCallback(CycleCollectorResults &aResults)
|
|||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
nsJSContext::KillICCTimer();
|
|
||||||
|
|
||||||
sCCollectedWaitingForGC += aResults.mFreedRefCounted + aResults.mFreedGCed;
|
sCCollectedWaitingForGC += aResults.mFreedRefCounted + aResults.mFreedGCed;
|
||||||
|
|
||||||
// If we collected a substantial amount of cycles, poke the GC since more objects
|
// If we collected a substantial amount of cycles, poke the GC since more objects
|
||||||
@ -2337,17 +2266,6 @@ ShouldTriggerCC(uint32_t aSuspected)
|
|||||||
sLastCCEndTime + NS_CC_FORCED < PR_Now());
|
sLastCCEndTime + NS_CC_FORCED < PR_Now());
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
TimeToNextCC()
|
|
||||||
{
|
|
||||||
if (sIncrementalCC) {
|
|
||||||
return NS_CC_DELAY - kMaxICCDuration;
|
|
||||||
}
|
|
||||||
return NS_CC_DELAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
static_assert(NS_CC_DELAY > kMaxICCDuration, "ICC shouldn't reduce CC delay to 0");
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
CCTimerFired(nsITimer *aTimer, void *aClosure)
|
CCTimerFired(nsITimer *aTimer, void *aClosure)
|
||||||
{
|
{
|
||||||
@ -2357,7 +2275,7 @@ CCTimerFired(nsITimer *aTimer, void *aClosure)
|
|||||||
|
|
||||||
static uint32_t ccDelay = NS_CC_DELAY;
|
static uint32_t ccDelay = NS_CC_DELAY;
|
||||||
if (sCCLockedOut) {
|
if (sCCLockedOut) {
|
||||||
ccDelay = TimeToNextCC() / 3;
|
ccDelay = NS_CC_DELAY / 3;
|
||||||
|
|
||||||
PRTime now = PR_Now();
|
PRTime now = PR_Now();
|
||||||
if (sCCLockedOutTime == 0) {
|
if (sCCLockedOutTime == 0) {
|
||||||
@ -2379,8 +2297,8 @@ CCTimerFired(nsITimer *aTimer, void *aClosure)
|
|||||||
|
|
||||||
// During early timer fires, we only run forgetSkippable. During the first
|
// During early timer fires, we only run forgetSkippable. During the first
|
||||||
// late timer fire, we decide if we are going to have a second and final
|
// late timer fire, we decide if we are going to have a second and final
|
||||||
// late timer fire, where we may begin to run the CC.
|
// late timer fire, where we may run the CC.
|
||||||
uint32_t numEarlyTimerFires = ccDelay / NS_CC_SKIPPABLE_DELAY - 2;
|
const uint32_t numEarlyTimerFires = ccDelay / NS_CC_SKIPPABLE_DELAY - 2;
|
||||||
bool isLateTimerFire = sCCTimerFireCount > numEarlyTimerFires;
|
bool isLateTimerFire = sCCTimerFireCount > numEarlyTimerFires;
|
||||||
uint32_t suspected = nsCycleCollector_suspectedCount();
|
uint32_t suspected = nsCycleCollector_suspectedCount();
|
||||||
if (isLateTimerFire && ShouldTriggerCC(suspected)) {
|
if (isLateTimerFire && ShouldTriggerCC(suspected)) {
|
||||||
@ -2395,7 +2313,7 @@ CCTimerFired(nsITimer *aTimer, void *aClosure)
|
|||||||
// We are in the final timer fire and still meet the conditions for
|
// We are in the final timer fire and still meet the conditions for
|
||||||
// triggering a CC. Let CycleCollectNow finish the current IGC, if any,
|
// triggering a CC. Let CycleCollectNow finish the current IGC, if any,
|
||||||
// because that will allow us to include the GC time in the CC pause.
|
// because that will allow us to include the GC time in the CC pause.
|
||||||
nsJSContext::ScheduledCycleCollectNow(ICCSliceTime());
|
nsJSContext::ScheduledCycleCollectNow();
|
||||||
}
|
}
|
||||||
} else if ((sPreviousSuspectedCount + 100) <= suspected) {
|
} else if ((sPreviousSuspectedCount + 100) <= suspected) {
|
||||||
// Only do a forget skippable if there are more than a few new objects.
|
// Only do a forget skippable if there are more than a few new objects.
|
||||||
@ -2403,7 +2321,7 @@ CCTimerFired(nsITimer *aTimer, void *aClosure)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isLateTimerFire) {
|
if (isLateTimerFire) {
|
||||||
ccDelay = TimeToNextCC();
|
ccDelay = NS_CC_DELAY;
|
||||||
|
|
||||||
// We have either just run the CC or decided we don't want to run the CC
|
// We have either just run the CC or decided we don't want to run the CC
|
||||||
// next time, so kill the timer.
|
// next time, so kill the timer.
|
||||||
@ -2507,7 +2425,7 @@ nsJSContext::PokeShrinkGCBuffers()
|
|||||||
void
|
void
|
||||||
nsJSContext::MaybePokeCC()
|
nsJSContext::MaybePokeCC()
|
||||||
{
|
{
|
||||||
if (sCCTimer || sICCTimer || sShuttingDown || !sHasRunGC) {
|
if (sCCTimer || sShuttingDown || !sHasRunGC) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2579,19 +2497,6 @@ nsJSContext::KillCCTimer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
|
||||||
void
|
|
||||||
nsJSContext::KillICCTimer()
|
|
||||||
{
|
|
||||||
sCCLockedOutTime = 0;
|
|
||||||
|
|
||||||
if (sICCTimer) {
|
|
||||||
sICCTimer->Cancel();
|
|
||||||
|
|
||||||
NS_RELEASE(sICCTimer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsJSContext::GC(JS::gcreason::Reason aReason)
|
nsJSContext::GC(JS::gcreason::Reason aReason)
|
||||||
{
|
{
|
||||||
@ -2753,7 +2658,7 @@ void
|
|||||||
mozilla::dom::StartupJSEnvironment()
|
mozilla::dom::StartupJSEnvironment()
|
||||||
{
|
{
|
||||||
// initialize all our statics, so that we can restart XPCOM
|
// initialize all our statics, so that we can restart XPCOM
|
||||||
sGCTimer = sFullGCTimer = sCCTimer = sICCTimer = nullptr;
|
sGCTimer = sFullGCTimer = sCCTimer = nullptr;
|
||||||
sCCLockedOut = false;
|
sCCLockedOut = false;
|
||||||
sCCLockedOutTime = 0;
|
sCCLockedOutTime = 0;
|
||||||
sLastCCEndTime = 0;
|
sLastCCEndTime = 0;
|
||||||
@ -2849,13 +2754,6 @@ SetMemoryGCDynamicMarkSlicePrefChangedCallback(const char* aPrefName, void* aClo
|
|||||||
JS_SetGCParameter(sRuntime, JSGC_DYNAMIC_MARK_SLICE, pref);
|
JS_SetGCParameter(sRuntime, JSGC_DYNAMIC_MARK_SLICE, pref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
SetIncrementalCCPrefChangedCallback(const char* aPrefName, void* aClosure)
|
|
||||||
{
|
|
||||||
bool pref = Preferences::GetBool(aPrefName);
|
|
||||||
sIncrementalCC = pref;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSObject*
|
JSObject*
|
||||||
NS_DOMReadStructuredClone(JSContext* cx,
|
NS_DOMReadStructuredClone(JSContext* cx,
|
||||||
JSStructuredCloneReader* reader,
|
JSStructuredCloneReader* reader,
|
||||||
@ -3062,9 +2960,6 @@ nsJSContext::EnsureStatics()
|
|||||||
"javascript.options.mem.gc_decommit_threshold_mb",
|
"javascript.options.mem.gc_decommit_threshold_mb",
|
||||||
(void *)JSGC_DECOMMIT_THRESHOLD);
|
(void *)JSGC_DECOMMIT_THRESHOLD);
|
||||||
|
|
||||||
Preferences::RegisterCallbackAndCall(SetIncrementalCCPrefChangedCallback,
|
|
||||||
"dom.cycle_collector.incremental");
|
|
||||||
|
|
||||||
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
||||||
if (!obs) {
|
if (!obs) {
|
||||||
MOZ_CRASH();
|
MOZ_CRASH();
|
||||||
|
@ -101,17 +101,11 @@ public:
|
|||||||
IsShrinking aShrinking = NonShrinkingGC,
|
IsShrinking aShrinking = NonShrinkingGC,
|
||||||
int64_t aSliceMillis = 0);
|
int64_t aSliceMillis = 0);
|
||||||
static void ShrinkGCBuffersNow();
|
static void ShrinkGCBuffersNow();
|
||||||
|
|
||||||
// If aExtraForgetSkippableCalls is -1, forgetSkippable won't be
|
// If aExtraForgetSkippableCalls is -1, forgetSkippable won't be
|
||||||
// called even if the previous collection was GC.
|
// called even if the previous collection was GC.
|
||||||
static void CycleCollectNow(nsICycleCollectorListener *aListener = nullptr,
|
static void CycleCollectNow(nsICycleCollectorListener *aListener = nullptr,
|
||||||
int32_t aExtraForgetSkippableCalls = 0);
|
int32_t aExtraForgetSkippableCalls = 0);
|
||||||
|
static void ScheduledCycleCollectNow();
|
||||||
// If aSliceTime is negative, the CC will run to completion. If aSliceTime
|
|
||||||
// is 0, only a minimum quantum of work will be done. Otherwise, aSliceTime
|
|
||||||
// will be used as the time budget for the slice, in ms.
|
|
||||||
static void ScheduledCycleCollectNow(int64_t aSliceTime);
|
|
||||||
|
|
||||||
static void BeginCycleCollectionCallback();
|
static void BeginCycleCollectionCallback();
|
||||||
static void EndCycleCollectionCallback(mozilla::CycleCollectorResults &aResults);
|
static void EndCycleCollectionCallback(mozilla::CycleCollectorResults &aResults);
|
||||||
|
|
||||||
@ -123,7 +117,6 @@ public:
|
|||||||
|
|
||||||
static void MaybePokeCC();
|
static void MaybePokeCC();
|
||||||
static void KillCCTimer();
|
static void KillCCTimer();
|
||||||
static void KillICCTimer();
|
|
||||||
static void KillFullGCTimer();
|
static void KillFullGCTimer();
|
||||||
static void KillInterSliceGCTimer();
|
static void KillInterSliceGCTimer();
|
||||||
|
|
||||||
|
@ -713,8 +713,6 @@ pref("dom.sysmsg.enabled", false);
|
|||||||
// Enable pre-installed applications.
|
// Enable pre-installed applications.
|
||||||
pref("dom.webapps.useCurrentProfile", false);
|
pref("dom.webapps.useCurrentProfile", false);
|
||||||
|
|
||||||
pref("dom.cycle_collector.incremental", false);
|
|
||||||
|
|
||||||
// Parsing perf prefs. For now just mimic what the old code did.
|
// Parsing perf prefs. For now just mimic what the old code did.
|
||||||
#ifndef XP_WIN
|
#ifndef XP_WIN
|
||||||
pref("content.sink.pending_event_mode", 0);
|
pref("content.sink.pending_event_mode", 0);
|
||||||
|
@ -3056,8 +3056,7 @@ nsCycleCollector::Collect(ccType aCCType,
|
|||||||
// don't want to abandon the current CC, because the graph contains
|
// don't want to abandon the current CC, because the graph contains
|
||||||
// information about purple roots. So we synchronously finish off
|
// information about purple roots. So we synchronously finish off
|
||||||
// the current CC.
|
// the current CC.
|
||||||
void
|
void nsCycleCollector::PrepareForGarbageCollection()
|
||||||
nsCycleCollector::PrepareForGarbageCollection()
|
|
||||||
{
|
{
|
||||||
if (mIncrementalPhase == IdlePhase) {
|
if (mIncrementalPhase == IdlePhase) {
|
||||||
MOZ_ASSERT(mGraph.IsEmpty(), "Non-empty graph when idle");
|
MOZ_ASSERT(mGraph.IsEmpty(), "Non-empty graph when idle");
|
||||||
@ -3552,7 +3551,7 @@ nsCycleCollector_collect(nsICycleCollectorListener *aManualListener)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
nsCycleCollector_scheduledCollect(int64_t aSliceTime)
|
nsCycleCollector_scheduledCollect()
|
||||||
{
|
{
|
||||||
CollectorData *data = sCollectorData.get();
|
CollectorData *data = sCollectorData.get();
|
||||||
|
|
||||||
@ -3561,13 +3560,8 @@ nsCycleCollector_scheduledCollect(int64_t aSliceTime)
|
|||||||
MOZ_ASSERT(data->mCollector);
|
MOZ_ASSERT(data->mCollector);
|
||||||
|
|
||||||
PROFILER_LABEL("CC", "nsCycleCollector_scheduledCollect");
|
PROFILER_LABEL("CC", "nsCycleCollector_scheduledCollect");
|
||||||
SliceBudget budget;
|
SliceBudget unlimitedBudget;
|
||||||
if (aSliceTime > 0) {
|
data->mCollector->Collect(ScheduledCC, unlimitedBudget, nullptr);
|
||||||
budget = SliceBudget::TimeBudget(aSliceTime);
|
|
||||||
} else if (aSliceTime == 0) {
|
|
||||||
budget = SliceBudget::WorkBudget(1);
|
|
||||||
}
|
|
||||||
data->mCollector->Collect(ScheduledCC, budget, nullptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -41,11 +41,7 @@ void nsCycleCollector_dispatchDeferredDeletion(bool aContinuation = false);
|
|||||||
bool nsCycleCollector_doDeferredDeletion();
|
bool nsCycleCollector_doDeferredDeletion();
|
||||||
|
|
||||||
void nsCycleCollector_collect(nsICycleCollectorListener *aManualListener);
|
void nsCycleCollector_collect(nsICycleCollectorListener *aManualListener);
|
||||||
|
void nsCycleCollector_scheduledCollect();
|
||||||
// If aSliceTime is negative, the CC will run to completion. If aSliceTime
|
|
||||||
// is 0, only a minimum quantum of work will be done. Otherwise, aSliceTime
|
|
||||||
// will be used as the time budget for the slice, in ms.
|
|
||||||
void nsCycleCollector_scheduledCollect(int64_t aSliceTime);
|
|
||||||
|
|
||||||
uint32_t nsCycleCollector_suspectedCount();
|
uint32_t nsCycleCollector_suspectedCount();
|
||||||
void nsCycleCollector_shutdown();
|
void nsCycleCollector_shutdown();
|
||||||
|
Loading…
Reference in New Issue
Block a user