void JSRuntime::sizeOfIncludingThis(JSMallocSizeOfFun mallocSizeOf, JS::RuntimeSizes *rtSizes) { rtSizes->object = mallocSizeOf(this); rtSizes->atomsTable = atoms.sizeOfExcludingThis(mallocSizeOf); rtSizes->contexts = 0; for (ContextIter acx(this); !acx.done(); acx.next()) rtSizes->contexts += acx->sizeOfIncludingThis(mallocSizeOf); rtSizes->dtoa = mallocSizeOf(dtoaState); rtSizes->temporary = tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); rtSizes->code = JS::CodeSizes(); if (execAlloc_) execAlloc_->sizeOfCode(&rtSizes->code); rtSizes->regexpData = bumpAlloc_ ? bumpAlloc_->sizeOfNonHeapData() : 0; rtSizes->stack = stackSpace.sizeOf(); rtSizes->gcMarker = gcMarker.sizeOfExcludingThis(mallocSizeOf); rtSizes->mathCache = mathCache_ ? mathCache_->sizeOfIncludingThis(mallocSizeOf) : 0; rtSizes->scriptData = scriptDataTable.sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable.all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); }
void JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes *rtSizes) { // Several tables in the runtime enumerated below can be used off thread. AutoLockForExclusiveAccess lock(this); rtSizes->object += mallocSizeOf(this); rtSizes->atomsTable += atoms().sizeOfIncludingThis(mallocSizeOf); if (!parentRuntime) { rtSizes->atomsTable += mallocSizeOf(staticStrings); rtSizes->atomsTable += mallocSizeOf(commonNames); rtSizes->atomsTable += permanentAtoms->sizeOfIncludingThis(mallocSizeOf); } for (ContextIter acx(this); !acx.done(); acx.next()) rtSizes->contexts += acx->sizeOfIncludingThis(mallocSizeOf); rtSizes->dtoa += mallocSizeOf(mainThread.dtoaState); rtSizes->temporary += tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); #ifdef JS_YARR rtSizes->regexpData += bumpAlloc_ ? bumpAlloc_->sizeOfNonHeapData() : 0; #endif rtSizes->interpreterStack += interpreterStack_.sizeOfExcludingThis(mallocSizeOf); rtSizes->mathCache += mathCache_ ? mathCache_->sizeOfIncludingThis(mallocSizeOf) : 0; rtSizes->sourceDataCache += sourceDataCache.sizeOfExcludingThis(mallocSizeOf); rtSizes->scriptData += scriptDataTable().sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable().all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); if (execAlloc_) execAlloc_->addSizeOfCode(&rtSizes->code); #ifdef JS_ION { AutoLockForInterrupt lock(this); if (jitRuntime()) { if (JSC::ExecutableAllocator *ionAlloc = jitRuntime()->ionAlloc(this)) ionAlloc->addSizeOfCode(&rtSizes->code); } } #endif rtSizes->gc.marker += gc.marker.sizeOfExcludingThis(mallocSizeOf); #ifdef JSGC_GENERATIONAL rtSizes->gc.nurseryCommitted += gc.nursery.sizeOfHeapCommitted(); rtSizes->gc.nurseryDecommitted += gc.nursery.sizeOfHeapDecommitted(); rtSizes->gc.nurseryHugeSlots += gc.nursery.sizeOfHugeSlots(mallocSizeOf); gc.storeBuffer.addSizeOfExcludingThis(mallocSizeOf, &rtSizes->gc); #endif }
void JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes) { // Several tables in the runtime enumerated below can be used off thread. AutoLockForExclusiveAccess lock(this); // For now, measure the size of the derived class (JSContext). // TODO (bug 1281529): make memory reporting reflect the new // JSContext/JSRuntime world better. JSContext* cx = unsafeContextFromAnyThread(); rtSizes->object += mallocSizeOf(cx); rtSizes->atomsTable += atoms(lock).sizeOfIncludingThis(mallocSizeOf); if (!parentRuntime) { rtSizes->atomsTable += mallocSizeOf(staticStrings); rtSizes->atomsTable += mallocSizeOf(commonNames); rtSizes->atomsTable += permanentAtoms->sizeOfIncludingThis(mallocSizeOf); } rtSizes->contexts += cx->sizeOfExcludingThis(mallocSizeOf); rtSizes->temporary += tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); rtSizes->interpreterStack += interpreterStack_.sizeOfExcludingThis(mallocSizeOf); if (MathCache* cache = cx->caches.maybeGetMathCache()) rtSizes->mathCache += cache->sizeOfIncludingThis(mallocSizeOf); if (sharedImmutableStrings_) { rtSizes->sharedImmutableStringsCache += sharedImmutableStrings_->sizeOfExcludingThis(mallocSizeOf); } rtSizes->uncompressedSourceCache += cx->caches.uncompressedSourceCache.sizeOfExcludingThis(mallocSizeOf); rtSizes->scriptData += scriptDataTable(lock).sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable(lock).all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); if (jitRuntime_) { jitRuntime_->execAlloc().addSizeOfCode(&rtSizes->code); jitRuntime_->backedgeExecAlloc().addSizeOfCode(&rtSizes->code); } rtSizes->gc.marker += gc.marker.sizeOfExcludingThis(mallocSizeOf); rtSizes->gc.nurseryCommitted += gc.nursery.sizeOfHeapCommitted(); rtSizes->gc.nurseryMallocedBuffers += gc.nursery.sizeOfMallocedBuffers(mallocSizeOf); gc.storeBuffer.addSizeOfExcludingThis(mallocSizeOf, &rtSizes->gc); }
void JSRuntime::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes) { // Several tables in the runtime enumerated below can be used off thread. AutoLockForExclusiveAccess lock(this); rtSizes->object += mallocSizeOf(this); rtSizes->atomsTable += atoms(lock).sizeOfIncludingThis(mallocSizeOf); if (!parentRuntime) { rtSizes->atomsTable += mallocSizeOf(staticStrings); rtSizes->atomsTable += mallocSizeOf(commonNames); rtSizes->atomsTable += permanentAtoms->sizeOfIncludingThis(mallocSizeOf); } for (ContextIter acx(this); !acx.done(); acx.next()) rtSizes->contexts += acx->sizeOfIncludingThis(mallocSizeOf); rtSizes->temporary += tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); rtSizes->interpreterStack += interpreterStack_.sizeOfExcludingThis(mallocSizeOf); rtSizes->mathCache += mathCache_ ? mathCache_->sizeOfIncludingThis(mallocSizeOf) : 0; if (sharedImmutableStrings_) { rtSizes->sharedImmutableStringsCache += sharedImmutableStrings_->sizeOfExcludingThis(mallocSizeOf); } rtSizes->uncompressedSourceCache += uncompressedSourceCache.sizeOfExcludingThis(mallocSizeOf); rtSizes->scriptData += scriptDataTable(lock).sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable(lock).all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); if (jitRuntime_) { jitRuntime_->execAlloc().addSizeOfCode(&rtSizes->code); jitRuntime_->backedgeExecAlloc().addSizeOfCode(&rtSizes->code); } rtSizes->gc.marker += gc.marker.sizeOfExcludingThis(mallocSizeOf); rtSizes->gc.nurseryCommitted += gc.nursery.sizeOfHeapCommitted(); rtSizes->gc.nurseryDecommitted += gc.nursery.sizeOfHeapDecommitted(); rtSizes->gc.nurseryMallocedBuffers += gc.nursery.sizeOfMallocedBuffers(mallocSizeOf); gc.storeBuffer.addSizeOfExcludingThis(mallocSizeOf, &rtSizes->gc); }
void JSRuntime::sizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes *rtSizes) { // Several tables in the runtime enumerated below can be used off thread. AutoLockForExclusiveAccess lock(this); rtSizes->object = mallocSizeOf(this); rtSizes->atomsTable = atoms().sizeOfExcludingThis(mallocSizeOf); rtSizes->contexts = 0; for (ContextIter acx(this); !acx.done(); acx.next()) rtSizes->contexts += acx->sizeOfIncludingThis(mallocSizeOf); rtSizes->dtoa = mallocSizeOf(mainThread.dtoaState); rtSizes->temporary = tempLifoAlloc.sizeOfExcludingThis(mallocSizeOf); rtSizes->code = JS::CodeSizes(); if (execAlloc_) execAlloc_->sizeOfCode(&rtSizes->code); #ifdef JS_ION { AutoLockForOperationCallback lock(this); if (ionRuntime()) { if (JSC::ExecutableAllocator *ionAlloc = ionRuntime()->ionAlloc(this)) ionAlloc->sizeOfCode(&rtSizes->code); } } #endif rtSizes->regexpData = bumpAlloc_ ? bumpAlloc_->sizeOfNonHeapData() : 0; rtSizes->interpreterStack = interpreterStack_.sizeOfExcludingThis(mallocSizeOf); rtSizes->gcMarker = gcMarker.sizeOfExcludingThis(mallocSizeOf); rtSizes->mathCache = mathCache_ ? mathCache_->sizeOfIncludingThis(mallocSizeOf) : 0; rtSizes->scriptData = scriptDataTable().sizeOfExcludingThis(mallocSizeOf); for (ScriptDataTable::Range r = scriptDataTable().all(); !r.empty(); r.popFront()) rtSizes->scriptData += mallocSizeOf(r.front()); }