(SIGAR-188) implement mem actual free/used on Windows
This commit is contained in:
parent
f27542af5b
commit
e4fda73a29
|
@ -170,10 +170,28 @@ typedef enum {
|
|||
SC_STATUS_PROCESS_INFO = 0
|
||||
} SC_STATUS_TYPE;
|
||||
|
||||
typedef struct _PERFORMANCE_INFORMATION {
|
||||
DWORD cb;
|
||||
SIZE_T CommitTotal;
|
||||
SIZE_T CommitLimit;
|
||||
SIZE_T CommitPeak;
|
||||
SIZE_T PhysicalTotal;
|
||||
SIZE_T PhysicalAvailable;
|
||||
SIZE_T SystemCache;
|
||||
SIZE_T KernelTotal;
|
||||
SIZE_T KernelPaged;
|
||||
SIZE_T KernelNonpaged;
|
||||
SIZE_T PageSize;
|
||||
DWORD HandleCount;
|
||||
DWORD ProcessCount;
|
||||
DWORD ThreadCount;
|
||||
} PERFORMANCE_INFORMATION, *PPERFORMANCE_INFORMATION;
|
||||
|
||||
#ifndef ERROR_DATATYPE_MISMATCH
|
||||
#define ERROR_DATATYPE_MISMATCH 1629L
|
||||
#endif
|
||||
|
||||
#else
|
||||
#include <psapi.h>
|
||||
#endif /* _MSC_VER */
|
||||
|
||||
#include <iprtrmib.h>
|
||||
|
@ -437,6 +455,8 @@ typedef BOOL (CALLBACK *psapi_enum_processes)(DWORD *,
|
|||
DWORD,
|
||||
DWORD *);
|
||||
|
||||
typedef BOOL (CALLBACK *psapi_get_perf_info)(PPERFORMANCE_INFORMATION, DWORD);
|
||||
|
||||
/* winsta.dll */
|
||||
typedef BOOLEAN (CALLBACK *winsta_query_info)(HANDLE,
|
||||
ULONG,
|
||||
|
@ -513,6 +533,7 @@ typedef struct {
|
|||
SIGAR_DLLFUNC(psapi, enum_modules);
|
||||
SIGAR_DLLFUNC(psapi, enum_processes);
|
||||
SIGAR_DLLFUNC(psapi, get_module_name);
|
||||
SIGAR_DLLFUNC(psapi, get_perf_info);
|
||||
|
||||
sigar_dll_func_t end;
|
||||
} sigar_psapi_t;
|
||||
|
|
|
@ -341,6 +341,7 @@ static sigar_psapi_t sigar_psapi = {
|
|||
{ "EnumProcessModules", NULL },
|
||||
{ "EnumProcesses", NULL },
|
||||
{ "GetModuleFileNameExA", NULL },
|
||||
{ "GetPerformanceInfo", NULL },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -630,9 +631,14 @@ char *sigar_os_error_string(sigar_t *sigar, int err)
|
|||
#define sigar_GlobalMemoryStatusEx \
|
||||
sigar->kernel.memory_status.func
|
||||
|
||||
#define sigar_GetPerformanceInfo \
|
||||
sigar->psapi.get_perf_info.func
|
||||
|
||||
SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
||||
{
|
||||
sigar_uint64_t kern = 0;
|
||||
DLLMOD_INIT(kernel, TRUE);
|
||||
DLLMOD_INIT(psapi, FALSE);
|
||||
|
||||
if (sigar_GlobalMemoryStatusEx) {
|
||||
MEMORYSTATUSEX memstat;
|
||||
|
@ -645,6 +651,14 @@ SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
|||
|
||||
mem->total = memstat.ullTotalPhys;
|
||||
mem->free = memstat.ullAvailPhys;
|
||||
|
||||
if (sigar_GetPerformanceInfo) {
|
||||
PERFORMANCE_INFORMATION info;
|
||||
if (sigar_GetPerformanceInfo(&info, sizeof(info))) {
|
||||
kern = info.SystemCache;
|
||||
kern *= sigar->pagesize;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
MEMORYSTATUS memstat;
|
||||
|
@ -655,8 +669,8 @@ SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
|
|||
|
||||
mem->used = mem->total - mem->free;
|
||||
|
||||
mem->actual_free = mem->free;
|
||||
mem->actual_used = mem->used;
|
||||
mem->actual_free = mem->free + kern;
|
||||
mem->actual_used = mem->used - kern;
|
||||
|
||||
sigar_mem_calc_ram(sigar, mem);
|
||||
|
||||
|
|
Loading…
Reference in New Issue