diff --git a/js/src/gc/Allocator.cpp b/js/src/gc/Allocator.cpp index e1c74ec29cc2..5677018169c5 100644 --- a/js/src/gc/Allocator.cpp +++ b/js/src/gc/Allocator.cpp @@ -244,15 +244,17 @@ GCRuntime::tryNewTenuredThing(JSContext* cx, AllocKind kind, size_t thingSize) // chunks available it may also allocate new memory directly. t = reinterpret_cast(refillFreeListFromAnyThread(cx, kind)); - if (MOZ_UNLIKELY(!t && allowGC && !cx->helperThread())) { - // We have no memory available for a new chunk; perform an - // all-compartments, non-incremental, shrinking GC and wait for - // sweeping to finish. - JS::PrepareForFullGC(cx); - cx->runtime()->gc.gc(GC_SHRINK, JS::gcreason::LAST_DITCH); - cx->runtime()->gc.waitBackgroundSweepOrAllocEnd(); + if (MOZ_UNLIKELY(!t && allowGC)) { + if (!cx->helperThread()) { + // We have no memory available for a new chunk; perform an + // all-compartments, non-incremental, shrinking GC and wait for + // sweeping to finish. + JS::PrepareForFullGC(cx); + cx->runtime()->gc.gc(GC_SHRINK, JS::gcreason::LAST_DITCH); + cx->runtime()->gc.waitBackgroundSweepOrAllocEnd(); - t = tryNewTenuredThing(cx, kind, thingSize); + t = tryNewTenuredThing(cx, kind, thingSize); + } if (!t) ReportOutOfMemory(cx); }