mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-01 08:42:13 +00:00
Bug 893242 - Part 4: Add a memory reporter counting ContentParents and the number of IPC messages they have outstanding. r=njn
This commit is contained in:
parent
545d682d16
commit
ca73e2d2f6
@ -202,6 +202,79 @@ MemoryReportRequestParent::~MemoryReportRequestParent()
|
||||
MOZ_COUNT_DTOR(MemoryReportRequestParent);
|
||||
}
|
||||
|
||||
/**
|
||||
* A memory reporter for ContentParent objects themselves.
|
||||
*/
|
||||
class ContentParentMemoryReporter MOZ_FINAL : public nsIMemoryMultiReporter
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIMEMORYMULTIREPORTER
|
||||
NS_MEMORY_REPORTER_MALLOC_SIZEOF_FUN(MallocSizeOf)
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS1(ContentParentMemoryReporter, nsIMemoryMultiReporter)
|
||||
|
||||
NS_IMETHODIMP
|
||||
ContentParentMemoryReporter::GetName(nsACString& aName)
|
||||
{
|
||||
aName.AssignLiteral("ContentParents");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
ContentParentMemoryReporter::CollectReports(nsIMemoryMultiReporterCallback* cb,
|
||||
nsISupports* aClosure)
|
||||
{
|
||||
nsAutoTArray<ContentParent*, 16> cps;
|
||||
ContentParent::GetAllEvenIfDead(cps);
|
||||
|
||||
for (uint32_t i = 0; i < cps.Length(); i++) {
|
||||
ContentParent* cp = cps[i];
|
||||
AsyncChannel* channel = cp->GetIPCChannel();
|
||||
|
||||
nsString friendlyName;
|
||||
cp->FriendlyName(friendlyName);
|
||||
|
||||
cp->AddRef();
|
||||
nsrefcnt refcnt = cp->Release();
|
||||
|
||||
const char* channelStr = "no channel";
|
||||
uint32_t numQueuedMessages = 0;
|
||||
if (channel) {
|
||||
if (channel->Unsound_IsClosed()) {
|
||||
channelStr = "closed channel";
|
||||
} else {
|
||||
channelStr = "open channel";
|
||||
}
|
||||
numQueuedMessages = channel->Unsound_NumQueuedMessages();
|
||||
}
|
||||
|
||||
nsPrintfCString path("queued-ipc-messages/content-parent"
|
||||
"(%s, pid=%d, %s, 0x%p, refcnt=%d)",
|
||||
NS_ConvertUTF16toUTF8(friendlyName).get(),
|
||||
cp->Pid(), channelStr, cp, refcnt);
|
||||
|
||||
NS_NAMED_LITERAL_CSTRING(desc,
|
||||
"The number of unset IPC messages held in this ContentParent's "
|
||||
"channel. A large value here might indicate that we're leaking "
|
||||
"messages. Similarly, a ContentParent object for a process that's no "
|
||||
"longer running could indicate that we're leaking ContentParents.");
|
||||
|
||||
nsresult rv = cb->Callback(/* process */ EmptyCString(),
|
||||
path,
|
||||
nsIMemoryReporter::KIND_OTHER,
|
||||
nsIMemoryReporter::UNITS_COUNT,
|
||||
numQueuedMessages,
|
||||
desc,
|
||||
aClosure);
|
||||
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsDataHashtable<nsStringHashKey, ContentParent*>* ContentParent::sAppContentParents;
|
||||
nsTArray<ContentParent*>* ContentParent::sNonAppContentParents;
|
||||
nsTArray<ContentParent*>* ContentParent::sPrivateContent;
|
||||
@ -266,6 +339,9 @@ ContentParent::StartUp()
|
||||
return;
|
||||
}
|
||||
|
||||
nsRefPtr<ContentParentMemoryReporter> mr = new ContentParentMemoryReporter();
|
||||
NS_RegisterMemoryMultiReporter(mr);
|
||||
|
||||
sCanLaunchSubprocesses = true;
|
||||
|
||||
// Try to preallocate a process that we can transform into an app later.
|
||||
|
Loading…
Reference in New Issue
Block a user