Bug 1246855 (part 2) - Measure CompartmentPrivates during memory reporting. r=terrence.

This also expands the coverage to include the hash table elements in the
mWrappedJSMap.
This commit is contained in:
Nicholas Nethercote 2016-02-10 08:41:38 +11:00
parent b1264afac3
commit c1d7c00a37
9 changed files with 48 additions and 5 deletions

View File

@ -713,7 +713,8 @@ struct CompartmentStats
macro(Other, MallocHeap, regexpCompartment) \
macro(Other, MallocHeap, savedStacksSet) \
macro(Other, MallocHeap, nonSyntacticLexicalScopesTable) \
macro(Other, MallocHeap, jitCompartment)
macro(Other, MallocHeap, jitCompartment) \
macro(Other, MallocHeap, privateData)
CompartmentStats()
: FOR_EACH_SIZE(ZERO_SIZE)

View File

@ -717,6 +717,13 @@ JS_SetDestroyCompartmentCallback(JSRuntime* rt, JSDestroyCompartmentCallback cal
rt->destroyCompartmentCallback = callback;
}
JS_PUBLIC_API(void)
JS_SetSizeOfIncludingThisCompartmentCallback(JSRuntime* rt,
JSSizeOfIncludingThisCompartmentCallback callback)
{
rt->sizeOfIncludingThisCompartmentCallback = callback;
}
JS_PUBLIC_API(void)
JS_SetDestroyZoneCallback(JSRuntime* rt, JSZoneCallback callback)
{

View File

@ -687,6 +687,10 @@ struct JSWrapObjectCallbacks
typedef void
(* JSDestroyCompartmentCallback)(JSFreeOp* fop, JSCompartment* compartment);
typedef size_t
(* JSSizeOfIncludingThisCompartmentCallback)(mozilla::MallocSizeOf mallocSizeOf,
JSCompartment* compartment);
typedef void
(* JSZoneCallback)(JS::Zone* zone);
@ -1315,6 +1319,10 @@ JS_GetImplementationVersion(void);
extern JS_PUBLIC_API(void)
JS_SetDestroyCompartmentCallback(JSRuntime* rt, JSDestroyCompartmentCallback callback);
extern JS_PUBLIC_API(void)
JS_SetSizeOfIncludingThisCompartmentCallback(JSRuntime* rt,
JSSizeOfIncludingThisCompartmentCallback callback);
extern JS_PUBLIC_API(void)
JS_SetDestroyZoneCallback(JSRuntime* rt, JSZoneCallback callback);

View File

@ -1114,7 +1114,8 @@ JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
size_t* regexpCompartment,
size_t* savedStacksSet,
size_t* nonSyntacticLexicalScopesArg,
size_t* jitCompartment)
size_t* jitCompartment,
size_t* privateData)
{
*compartmentObject += mallocSizeOf(this);
objectGroups.addSizeOfExcludingThis(mallocSizeOf, tiAllocationSiteTables,
@ -1134,6 +1135,10 @@ JSCompartment::addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf,
*nonSyntacticLexicalScopesArg += nonSyntacticLexicalScopes_->sizeOfIncludingThis(mallocSizeOf);
if (jitCompartment_)
*jitCompartment += jitCompartment_->sizeOfIncludingThis(mallocSizeOf);
auto callback = runtime_->sizeOfIncludingThisCompartmentCallback;
if (callback)
*privateData += callback(mallocSizeOf, this);
}
void

View File

@ -412,7 +412,8 @@ struct JSCompartment
size_t* regexpCompartment,
size_t* savedStacksSet,
size_t* nonSyntacticLexicalScopes,
size_t* jitCompartment);
size_t* jitCompartment,
size_t* privateData);
/*
* Shared scope property tree, and arena-pool for allocating its nodes.

View File

@ -344,7 +344,8 @@ StatsCompartmentCallback(JSRuntime* rt, void* data, JSCompartment* compartment)
&cStats.regexpCompartment,
&cStats.savedStacksSet,
&cStats.nonSyntacticLexicalScopesTable,
&cStats.jitCompartment);
&cStats.jitCompartment,
&cStats.privateData);
}
static void

View File

@ -166,6 +166,7 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime)
nativeStackBase(GetNativeStackBase()),
cxCallback(nullptr),
destroyCompartmentCallback(nullptr),
sizeOfIncludingThisCompartmentCallback(nullptr),
destroyZoneCallback(nullptr),
sweepZoneCallback(nullptr),
compartmentNameCallback(nullptr),

View File

@ -1058,6 +1058,9 @@ struct JSRuntime : public JS::shadow::Runtime,
/* Compartment destroy callback. */
JSDestroyCompartmentCallback destroyCompartmentCallback;
/* Compartment memory reporting callback. */
JSSizeOfIncludingThisCompartmentCallback sizeOfIncludingThisCompartmentCallback;
/* Zone destroy callback. */
JSZoneCallback destroyZoneCallback;

View File

@ -585,6 +585,13 @@ CompartmentDestroyedCallback(JSFreeOp* fop, JSCompartment* compartment)
JS_SetCompartmentPrivate(compartment, nullptr);
}
static size_t
CompartmentSizeOfIncludingThisCallback(MallocSizeOf mallocSizeOf, JSCompartment* compartment)
{
CompartmentPrivate* priv = CompartmentPrivate::Get(compartment);
return priv ? priv->SizeOfIncludingThis(mallocSizeOf) : 0;
}
void XPCJSRuntime::TraceNativeBlackRoots(JSTracer* trc)
{
// Skip this part if XPConnect is shutting down. We get into
@ -1516,7 +1523,10 @@ XPCJSRuntime::SizeOfIncludingThis(MallocSizeOf mallocSizeOf)
size_t
CompartmentPrivate::SizeOfIncludingThis(MallocSizeOf mallocSizeOf)
{
return mallocSizeOf(this) + mWrappedJSMap->SizeOfWrappedJS(mallocSizeOf);
size_t n = mallocSizeOf(this);
n += mWrappedJSMap->SizeOfIncludingThis(mallocSizeOf);
n += mWrappedJSMap->SizeOfWrappedJS(mallocSizeOf);
return n;
}
/***************************************************************************/
@ -2373,6 +2383,11 @@ ReportCompartmentStats(const JS::CompartmentStats& cStats,
cStats.jitCompartment,
"The JIT compartment.");
ZCREPORT_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("private-data"),
cStats.privateData,
"Extra data attached to the compartment by XPConnect, including "
"its wrapped-js.");
if (sundriesGCHeap > 0) {
// We deliberately don't use ZCREPORT_GC_BYTES here.
REPORT_GC_BYTES(cJSPathPrefix + NS_LITERAL_CSTRING("sundries/gc-heap"),
@ -3447,6 +3462,7 @@ XPCJSRuntime::XPCJSRuntime(nsXPConnect* aXPConnect)
JS_SetErrorReporter(runtime, xpc::SystemErrorReporter);
JS_SetDestroyCompartmentCallback(runtime, CompartmentDestroyedCallback);
JS_SetSizeOfIncludingThisCompartmentCallback(runtime, CompartmentSizeOfIncludingThisCallback);
JS_SetCompartmentNameCallback(runtime, CompartmentNameCallback);
mPrevGCSliceCallback = JS::SetGCSliceCallback(runtime, GCSliceCallback);
JS_AddFinalizeCallback(runtime, FinalizeCallback, nullptr);