mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1194061 - Implement "system-heap-allocated" reporter for Windows. r=dmajor.
This commit is contained in:
parent
ef3f7fd399
commit
e37e6d5b06
@ -177,8 +177,8 @@ public:
|
|||||||
NS_IMPL_ISUPPORTS(ResidentUniqueReporter, nsIMemoryReporter)
|
NS_IMPL_ISUPPORTS(ResidentUniqueReporter, nsIMemoryReporter)
|
||||||
|
|
||||||
#define HAVE_SYSTEM_HEAP_REPORTER 1
|
#define HAVE_SYSTEM_HEAP_REPORTER 1
|
||||||
size_t
|
nsresult
|
||||||
SystemHeapSize()
|
SystemHeapSize(int64_t* aSizeOut)
|
||||||
{
|
{
|
||||||
struct mallinfo info = mallinfo();
|
struct mallinfo info = mallinfo();
|
||||||
|
|
||||||
@ -192,7 +192,8 @@ SystemHeapSize()
|
|||||||
// Linux should usually be zero (so long as jemalloc is enabled) so that
|
// Linux should usually be zero (so long as jemalloc is enabled) so that
|
||||||
// shouldn't be a problem. Nonetheless, cast the |int|s to |size_t| before
|
// shouldn't be a problem. Nonetheless, cast the |int|s to |size_t| before
|
||||||
// adding them to provide a small amount of extra overflow protection.
|
// adding them to provide a small amount of extra overflow protection.
|
||||||
return size_t(info.hblkhd) + size_t(info.uordblks);
|
*aSizeOut = size_t(info.hblkhd) + size_t(info.uordblks);
|
||||||
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__DragonFly__) || defined(__FreeBSD__) \
|
#elif defined(__DragonFly__) || defined(__FreeBSD__) \
|
||||||
@ -568,6 +569,57 @@ PrivateDistinguishedAmount(int64_t* aN)
|
|||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define HAVE_SYSTEM_HEAP_REPORTER 1
|
||||||
|
// Windows can have multiple separate heaps. During testing there were multiple
|
||||||
|
// heaps present but the non-default ones had sizes no more than a few 10s of
|
||||||
|
// KiBs. So we combine their sizes into a single measurement.
|
||||||
|
nsresult
|
||||||
|
SystemHeapSize(int64_t* aSizeOut)
|
||||||
|
{
|
||||||
|
// Get the number of heaps.
|
||||||
|
DWORD nHeaps = GetProcessHeaps(0, nullptr);
|
||||||
|
NS_ENSURE_TRUE(nHeaps != 0, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
// Get handles to all heaps, checking that the number of heaps hasn't
|
||||||
|
// changed in the meantime.
|
||||||
|
UniquePtr<HANDLE[]> heaps(new HANDLE[nHeaps]);
|
||||||
|
DWORD nHeaps2 = GetProcessHeaps(nHeaps, heaps.get());
|
||||||
|
NS_ENSURE_TRUE(nHeaps2 != 0 && nHeaps2 == nHeaps, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
// Lock and iterate over each heap to get its size.
|
||||||
|
int64_t heapsSize = 0;
|
||||||
|
for (DWORD i = 0; i < nHeaps; i++) {
|
||||||
|
HANDLE heap = heaps[i];
|
||||||
|
|
||||||
|
NS_ENSURE_TRUE(HeapLock(heap), NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
int64_t heapSize = 0;
|
||||||
|
PROCESS_HEAP_ENTRY entry;
|
||||||
|
entry.lpData = nullptr;
|
||||||
|
while (HeapWalk(heap, &entry)) {
|
||||||
|
// We don't count entry.cbOverhead, because we just want to measure the
|
||||||
|
// space available to the program.
|
||||||
|
if (entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) {
|
||||||
|
heapSize += entry.cbData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check this result only after unlocking the heap, so that we don't leave
|
||||||
|
// the heap locked if there was an error.
|
||||||
|
DWORD lastError = GetLastError();
|
||||||
|
|
||||||
|
// I have no idea how things would proceed if unlocking this heap failed...
|
||||||
|
NS_ENSURE_TRUE(HeapUnlock(heap), NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
NS_ENSURE_TRUE(lastError == ERROR_NO_MORE_ITEMS, NS_ERROR_FAILURE);
|
||||||
|
|
||||||
|
heapsSize += heapSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
*aSizeOut = heapsSize;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
class WindowsAddressSpaceReporter final : public nsIMemoryReporter
|
class WindowsAddressSpaceReporter final : public nsIMemoryReporter
|
||||||
{
|
{
|
||||||
~WindowsAddressSpaceReporter() {}
|
~WindowsAddressSpaceReporter() {}
|
||||||
@ -835,7 +887,9 @@ public:
|
|||||||
NS_METHOD CollectReports(nsIHandleReportCallback* aHandleReport,
|
NS_METHOD CollectReports(nsIHandleReportCallback* aHandleReport,
|
||||||
nsISupports* aData, bool aAnonymize) override
|
nsISupports* aData, bool aAnonymize) override
|
||||||
{
|
{
|
||||||
int64_t amount = SystemHeapSize();
|
int64_t amount;
|
||||||
|
nsresult rv = SystemHeapSize(&amount);
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
return MOZ_COLLECT_REPORT(
|
return MOZ_COLLECT_REPORT(
|
||||||
"system-heap-allocated", KIND_OTHER, UNITS_BYTES, amount,
|
"system-heap-allocated", KIND_OTHER, UNITS_BYTES, amount,
|
||||||
|
Loading…
Reference in New Issue
Block a user