author | Jon Coppeard <jcoppeard@mozilla.com> |
Thu, 02 Aug 2012 10:54:30 +0100 | |
changeset 101207 | 053116224bc97ab5227e4671f68b6f739b88c5d5 |
parent 101206 | 430c7512acee8d16b530945771e4ab3f253c1351 |
child 101208 | 7bb6717bc95f92682817a3449aed365630aaa5f4 |
push id | 12897 |
push user | jcoppeard@mozilla.com |
push date | Thu, 02 Aug 2012 09:59:42 +0000 |
treeherder | mozilla-inbound@053116224bc9 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | billm |
bugs | 779172 |
milestone | 17.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
|
js/src/jsgc.cpp | file | annotate | diff | comparison | revisions |
--- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -3874,32 +3874,36 @@ IncrementalCollectSlice(JSRuntime *rt, AutoCopyFreeListToArenas copy(rt); AutoGCSlice slice(rt); gc::State initialState = rt->gcIncrementalState; SliceBudget sliceBudget(budget); int zeal = 0; #ifdef JS_GC_ZEAL - if (reason == gcreason::DEBUG_GC) { + if (reason == gcreason::DEBUG_GC && budget != SliceBudget::Unlimited) { /* - * Do the collection type specified by zeal mode only if the collection - * was triggered by RunDebugGC(). + * Do the incremental collection type specified by zeal mode if the + * collection was triggered by RunDebugGC() and incremental GC has not + * been cancelled by ResetIncrementalGC. */ zeal = rt->gcZeal(); - JS_ASSERT_IF(zeal == ZealIncrementalMarkAllThenFinish || - zeal == ZealIncrementalRootsThenFinish, - budget == SliceBudget::Unlimited); } #endif bool isIncremental = rt->gcIncrementalState != NO_INCREMENTAL || - budget != SliceBudget::Unlimited || - zeal == ZealIncrementalRootsThenFinish || - zeal == ZealIncrementalMarkAllThenFinish; + budget != SliceBudget::Unlimited; + + if (zeal == ZealIncrementalRootsThenFinish || zeal == ZealIncrementalMarkAllThenFinish) { + /* + * Yields between slices occurs at predetermined points in these + * modes. sliceBudget is not used. + */ + sliceBudget.reset(); + } if (rt->gcIncrementalState == NO_INCREMENTAL) { rt->gcIncrementalState = MARK_ROOTS; rt->gcLastMarkSlice = false; } switch (rt->gcIncrementalState) { @@ -4499,17 +4503,18 @@ RunDebugGC(JSContext *cx) * completion. */ if (initialState == NO_INCREMENTAL) rt->gcIncrementalLimit = rt->gcZealFrequency / 2; else rt->gcIncrementalLimit *= 2; budget = SliceBudget::WorkBudget(rt->gcIncrementalLimit); } else { - budget = SliceBudget::Unlimited; + // This triggers incremental GC but is actually ignored by IncrementalMarkSlice. + budget = SliceBudget::WorkBudget(1); } Collect(rt, true, budget, GC_NORMAL, gcreason::DEBUG_GC); /* * For multi-slice zeal, reset the slice size when we get to the sweep * phase. */