diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index fdd5a37ba253..b8d256a5d983 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1459,7 +1459,7 @@ nsJSContext::GarbageCollectNow(JS::gcreason::Reason aReason, if (sCCLockedOut && aIncremental == IncrementalGC) { // We're in the middle of incremental GC. Do another slice. JS::PrepareForIncrementalGC(sRuntime); - JS::IncrementalGC(sRuntime, aReason, aSliceMillis); + JS::IncrementalGCSlice(sRuntime, aReason, aSliceMillis); return; } @@ -1472,7 +1472,7 @@ nsJSContext::GarbageCollectNow(JS::gcreason::Reason aReason, if (aIncremental == IncrementalGC) { MOZ_ASSERT(aShrinking == NonShrinkingGC); - JS::IncrementalGC(sRuntime, aReason, aSliceMillis); + JS::StartIncrementalGC(sRuntime, aReason, aSliceMillis); } else if (aShrinking == ShrinkingGC) { JS::ShrinkingGC(sRuntime, aReason); } else { diff --git a/js/public/GCAPI.h b/js/public/GCAPI.h index 7f4b58a44101..9da731c5901b 100644 --- a/js/public/GCAPI.h +++ b/js/public/GCAPI.h @@ -207,16 +207,27 @@ ShrinkingGC(JSRuntime *rt, gcreason::Reason reason); */ /* - * Begin an incremental collection and perform one slice worth of work or - * perform a slice of an ongoing incremental collection. When this function - * returns, the collection is not complete. This function must be called - * repeatedly until !IsIncrementalGCInProgress(rt). + * Begin an incremental collection and perform one slice worth of work. When + * this function returns, the collection may not be complete. + * IncrementalGCSlice() must be called repeatedly until + * !IsIncrementalGCInProgress(rt). * * Note: SpiderMonkey's GC is not realtime. Slices in practice may be longer or * shorter than the requested interval. */ extern JS_FRIEND_API(void) -IncrementalGC(JSRuntime *rt, gcreason::Reason reason, int64_t millis = 0); +StartIncrementalGC(JSRuntime *rt, gcreason::Reason reason, int64_t millis = 0); + +/* + * Perform a slice of an ongoing incremental collection. When this function + * returns, the collection may not be complete. It must be called repeatedly + * until !IsIncrementalGCInProgress(rt). + * + * Note: SpiderMonkey's GC is not realtime. Slices in practice may be longer or + * shorter than the requested interval. + */ +extern JS_FRIEND_API(void) +IncrementalGCSlice(JSRuntime *rt, gcreason::Reason reason, int64_t millis = 0); /* * If IsIncrementalGCInProgress(rt), this call finishes the ongoing collection diff --git a/js/src/jsapi-tests/testGCFinalizeCallback.cpp b/js/src/jsapi-tests/testGCFinalizeCallback.cpp index e526ce1c1173..99673d6dd1c7 100644 --- a/js/src/jsapi-tests/testGCFinalizeCallback.cpp +++ b/js/src/jsapi-tests/testGCFinalizeCallback.cpp @@ -24,7 +24,7 @@ BEGIN_TEST(testGCFinalizeCallback) /* Full GC, incremental. */ FinalizeCalls = 0; JS::PrepareForFullGC(rt); - JS::IncrementalGC(rt, JS::gcreason::API, 1000000); + JS::StartIncrementalGC(rt, JS::gcreason::API, 1000000); CHECK(!rt->gc.isIncrementalGCInProgress()); CHECK(rt->gc.isFullGc()); CHECK(checkMultipleGroups()); @@ -61,7 +61,7 @@ BEGIN_TEST(testGCFinalizeCallback) /* Compartment GC, incremental, single compartment. */ FinalizeCalls = 0; JS::PrepareZoneForGC(global1->zone()); - JS::IncrementalGC(rt, JS::gcreason::API, 1000000); + JS::StartIncrementalGC(rt, JS::gcreason::API, 1000000); CHECK(!rt->gc.isIncrementalGCInProgress()); CHECK(!rt->gc.isFullGc()); CHECK(checkSingleGroup()); @@ -73,7 +73,7 @@ BEGIN_TEST(testGCFinalizeCallback) JS::PrepareZoneForGC(global1->zone()); JS::PrepareZoneForGC(global2->zone()); JS::PrepareZoneForGC(global3->zone()); - JS::IncrementalGC(rt, JS::gcreason::API, 1000000); + JS::StartIncrementalGC(rt, JS::gcreason::API, 1000000); CHECK(!rt->gc.isIncrementalGCInProgress()); CHECK(!rt->gc.isFullGc()); CHECK(checkMultipleGroups()); diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 1182ac528eee..41aca0d0ec4f 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -208,12 +208,15 @@ JS::ShrinkingGC(JSRuntime *rt, gcreason::Reason reason) } JS_FRIEND_API(void) -JS::IncrementalGC(JSRuntime *rt, gcreason::Reason reason, int64_t millis) +JS::StartIncrementalGC(JSRuntime *rt, gcreason::Reason reason, int64_t millis) { - if (!rt->gc.isIncrementalGCInProgress()) - rt->gc.startGC(GC_NORMAL, reason, millis); - else - rt->gc.gcSlice(reason, millis); + rt->gc.startGC(GC_NORMAL, reason, millis); +} + +JS_FRIEND_API(void) +JS::IncrementalGCSlice(JSRuntime *rt, gcreason::Reason reason, int64_t millis) +{ + rt->gc.gcSlice(reason, millis); } JS_FRIEND_API(void)