diff --git mozilla/xpcom/base/nsMemoryReporterManager.cpp mozilla/xpcom/base/nsMemoryReporterManager.cpp index a9aff58..674e757 100644 --- mozilla/xpcom/base/nsMemoryReporterManager.cpp +++ mozilla/xpcom/base/nsMemoryReporterManager.cpp @@ -32,7 +32,7 @@ using namespace mozilla; # include "jemalloc.h" #endif // MOZ_MEMORY -#if defined(XP_LINUX) || defined(XP_MACOSX) || defined(SOLARIS) +#ifdef XP_UNIX #include #include @@ -95,6 +95,81 @@ static nsresult GetResident(PRInt64 *n) return GetProcSelfStatmField(1, n); } +#elif defined(__DragonFly__) || defined(__FreeBSD__) \ + || defined(__NetBSD__) || defined(__OpenBSD__) + +#include +#include +#if defined(__DragonFly__) || defined(__FreeBSD__) +#include +#endif + +#include + +#if defined(__NetBSD__) +#undef KERN_PROC +#define KERN_PROC KERN_PROC2 +#define KINFO_PROC struct kinfo_proc2 +#else +#define KINFO_PROC struct kinfo_proc +#endif + +#if defined(__DragonFly__) +#define KP_SIZE(kp) (kp.kp_vm_map_size) +#define KP_RSS(kp) (kp.kp_vm_rssize * getpagesize()) +#elif defined(__FreeBSD__) +#define KP_SIZE(kp) (kp.ki_size) +#define KP_RSS(kp) (kp.ki_rssize * getpagesize()) +#elif defined(__NetBSD__) +#define KP_SIZE(kp) (kp.p_vm_msize * getpagesize()) +#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize()) +#elif defined(__OpenBSD__) +#define KP_SIZE(kp) ((kp.p_vm_dsize + kp.p_vm_ssize \ + + kp.p_vm_tsize) * getpagesize()) +#define KP_RSS(kp) (kp.p_vm_rssize * getpagesize()) +#endif + +static nsresult GetKinfoProcSelf(KINFO_PROC *proc) +{ + int mib[] = { + CTL_KERN, + KERN_PROC, + KERN_PROC_PID, + getpid(), +#if defined(__NetBSD__) || defined(__OpenBSD__) + sizeof(KINFO_PROC), + 1, +#endif + }; + u_int miblen = sizeof(mib) / sizeof(mib[0]); + size_t size = sizeof(KINFO_PROC); + if (sysctl(mib, miblen, proc, &size, NULL, 0)) + return NS_ERROR_FAILURE; + + return NS_OK; +} + +#define HAVE_VSIZE_AND_RESIDENT_REPORTERS 1 +static nsresult GetVsize(PRInt64 *n) +{ + KINFO_PROC proc; + nsresult rv = GetKinfoProcSelf(&proc); + if (NS_SUCCEEDED(rv)) + *n = KP_SIZE(proc); + + return rv; +} + +static nsresult GetResident(PRInt64 *n) +{ + KINFO_PROC proc; + nsresult rv = GetKinfoProcSelf(&proc); + if (NS_SUCCEEDED(rv)) + *n = KP_RSS(proc); + + return rv; +} + #elif defined(SOLARIS) #include