mirror of
https://github.com/microsoft/mimalloc.git
synced 2025-05-05 23:19:31 +03:00
Lazy-load psapi.dll
Let's load the `GetProcessMemoryInfo()` function dynamically. When needed. If needed. This is necessary because the start-up cost spent on loading dynamic libraries is non-negligible. Note: In contrast to how `os.c` loads libraries and obtains function addresses, we cannot call `FreeLibrary(hDll)` here because that would unload the `bcrypt` library before we want to use it. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
parent
11cab6a0c0
commit
948a0c44df
1 changed files with 36 additions and 8 deletions
44
src/stats.c
44
src/stats.c
|
@ -465,8 +465,6 @@ mi_msecs_t _mi_clock_end(mi_msecs_t start) {
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <psapi.h>
|
|
||||||
#pragma comment(lib,"psapi.lib")
|
|
||||||
|
|
||||||
static mi_msecs_t filetime_msecs(const FILETIME* ftime) {
|
static mi_msecs_t filetime_msecs(const FILETIME* ftime) {
|
||||||
ULARGE_INTEGER i;
|
ULARGE_INTEGER i;
|
||||||
|
@ -476,6 +474,23 @@ static mi_msecs_t filetime_msecs(const FILETIME* ftime) {
|
||||||
return msecs;
|
return msecs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _PROCESS_MEMORY_COUNTERS {
|
||||||
|
DWORD cb;
|
||||||
|
DWORD PageFaultCount;
|
||||||
|
SIZE_T PeakWorkingSetSize;
|
||||||
|
SIZE_T WorkingSetSize;
|
||||||
|
SIZE_T QuotaPeakPagedPoolUsage;
|
||||||
|
SIZE_T QuotaPagedPoolUsage;
|
||||||
|
SIZE_T QuotaPeakNonPagedPoolUsage;
|
||||||
|
SIZE_T QuotaNonPagedPoolUsage;
|
||||||
|
SIZE_T PagefileUsage;
|
||||||
|
SIZE_T PeakPagefileUsage;
|
||||||
|
} PROCESS_MEMORY_COUNTERS;
|
||||||
|
typedef PROCESS_MEMORY_COUNTERS* PPROCESS_MEMORY_COUNTERS;
|
||||||
|
typedef BOOL (WINAPI *PGetProcessMemoryInfo)(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD);
|
||||||
|
static PGetProcessMemoryInfo pGetProcessMemoryInfo = NULL;
|
||||||
|
static int GetProcessMemoryInfo_is_initialized = 0;
|
||||||
|
|
||||||
static void mi_stat_process_info(mi_msecs_t* elapsed, mi_msecs_t* utime, mi_msecs_t* stime, size_t* current_rss, size_t* peak_rss, size_t* current_commit, size_t* peak_commit, size_t* page_faults)
|
static void mi_stat_process_info(mi_msecs_t* elapsed, mi_msecs_t* utime, mi_msecs_t* stime, size_t* current_rss, size_t* peak_rss, size_t* current_commit, size_t* peak_commit, size_t* page_faults)
|
||||||
{
|
{
|
||||||
*elapsed = _mi_clock_end(mi_process_start);
|
*elapsed = _mi_clock_end(mi_process_start);
|
||||||
|
@ -487,12 +502,25 @@ static void mi_stat_process_info(mi_msecs_t* elapsed, mi_msecs_t* utime, mi_msec
|
||||||
*utime = filetime_msecs(&ut);
|
*utime = filetime_msecs(&ut);
|
||||||
*stime = filetime_msecs(&st);
|
*stime = filetime_msecs(&st);
|
||||||
PROCESS_MEMORY_COUNTERS info;
|
PROCESS_MEMORY_COUNTERS info;
|
||||||
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
|
|
||||||
*current_rss = (size_t)info.WorkingSetSize;
|
if (!GetProcessMemoryInfo_is_initialized) {
|
||||||
*peak_rss = (size_t)info.PeakWorkingSetSize;
|
HINSTANCE hDll;
|
||||||
*current_commit = (size_t)info.PagefileUsage;
|
hDll = LoadLibrary(TEXT("psapi.dll"));
|
||||||
*peak_commit = (size_t)info.PeakPagefileUsage;
|
if (hDll != NULL) {
|
||||||
*page_faults = (size_t)info.PageFaultCount;
|
pGetProcessMemoryInfo = (PGetProcessMemoryInfo)(void (*)(void))GetProcAddress(hDll, "GetProcessMemoryInfo");
|
||||||
|
}
|
||||||
|
GetProcessMemoryInfo_is_initialized = 1;
|
||||||
|
}
|
||||||
|
if (pGetProcessMemoryInfo) {
|
||||||
|
pGetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
|
||||||
|
*current_rss = (size_t)info.WorkingSetSize;
|
||||||
|
*peak_rss = (size_t)info.PeakWorkingSetSize;
|
||||||
|
*current_commit = (size_t)info.PagefileUsage;
|
||||||
|
*peak_commit = (size_t)info.PeakPagefileUsage;
|
||||||
|
*page_faults = (size_t)info.PageFaultCount;
|
||||||
|
} else {
|
||||||
|
*current_rss = *peak_rss = *current_commit = *peak_commit = *page_faults = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif !defined(__wasi__) && (defined(__unix__) || defined(__unix) || defined(unix) || defined(__APPLE__) || defined(__HAIKU__))
|
#elif !defined(__wasi__) && (defined(__unix__) || defined(__unix) || defined(unix) || defined(__APPLE__) || defined(__HAIKU__))
|
||||||
|
|
Loading…
Add table
Reference in a new issue