Bug 806644 - Back out 782072 (r=terrence,a=lsblakk)
--- a/js/src/jscntxt.cpp
+++ b/js/src/jscntxt.cpp
@@ -1317,25 +1317,24 @@ JSRuntime::setGCMaxMallocBytes(size_t va
gcMaxMallocBytes = (ptrdiff_t(value) >= 0) ? value : size_t(-1) >> 1;
for (CompartmentsIter c(this); !c.done(); c.next())
c->setGCMaxMallocBytes(value);
}
void
JSRuntime::updateMallocCounter(JSContext *cx, size_t nbytes)
{
- if (cx && cx->compartment) {
+ /* We tolerate any thread races when updating gcMallocBytes. */
+ ptrdiff_t oldCount = gcMallocBytes;
+ ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes);
+ gcMallocBytes = newCount;
+ if (JS_UNLIKELY(newCount <= 0 && oldCount > 0))
+ onTooMuchMalloc();
+ else if (cx && cx->compartment)
cx->compartment->updateMallocCounter(nbytes);
- } else {
- ptrdiff_t oldCount = gcMallocBytes;
- ptrdiff_t newCount = oldCount - ptrdiff_t(nbytes);
- gcMallocBytes = newCount;
- if (JS_UNLIKELY(newCount <= 0 && oldCount > 0))
- onTooMuchMalloc();
- }
}
JS_FRIEND_API(void)
JSRuntime::onTooMuchMalloc()
{
TriggerGC(this, gcreason::TOO_MUCH_MALLOC);
}
--- a/js/src/jscompartment.cpp
+++ b/js/src/jscompartment.cpp
@@ -71,17 +71,17 @@ JSCompartment::JSCompartment(JSRuntime *
debugModeBits(rt->debugMode ? DebugFromC : 0),
watchpointMap(NULL),
scriptCountsMap(NULL),
debugScriptMap(NULL)
#ifdef JS_ION
, ionCompartment_(NULL)
#endif
{
- setGCMaxMallocBytes(rt->gcMaxMallocBytes);
+ setGCMaxMallocBytes(rt->gcMaxMallocBytes * 0.9);
}
JSCompartment::~JSCompartment()
{
#ifdef JS_ION
js_delete(ionCompartment_);
#endif