* fhandler_proc.cc (format_proc_meminfo): On NT, try to figure out
real swap file usage by requesting SystemPagefileInformation. Use GlobalMemoryStatus as fallback. * ntdll.h (_SYSTEM_INFORMATION_CLASS): Add SystemPagefileInformation. (struct _SYSTEM_PAGEFILE_INFORMATION): Define.
This commit is contained in:
parent
f600e87caf
commit
891d1990ab
|
@ -1,3 +1,11 @@
|
|||
2004-03-18 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler_proc.cc (format_proc_meminfo): On NT, try to figure out
|
||||
real swap file usage by requesting SystemPagefileInformation. Use
|
||||
GlobalMemoryStatus as fallback.
|
||||
* ntdll.h (_SYSTEM_INFORMATION_CLASS): Add SystemPagefileInformation.
|
||||
(struct _SYSTEM_PAGEFILE_INFORMATION): Define.
|
||||
|
||||
2004-03-17 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* pipe.cc (fhandler_pipe::dup): Fix debugging message.
|
||||
|
|
|
@ -390,8 +390,42 @@ format_proc_meminfo (char *destbuf, size_t maxsize)
|
|||
GlobalMemoryStatus (&memory_status);
|
||||
mem_total = memory_status.dwTotalPhys;
|
||||
mem_free = memory_status.dwAvailPhys;
|
||||
swap_total = memory_status.dwTotalPageFile - mem_total;
|
||||
swap_free = memory_status.dwAvailPageFile - mem_total;
|
||||
PSYSTEM_PAGEFILE_INFORMATION spi = NULL;
|
||||
ULONG size = 512;
|
||||
NTSTATUS ret;
|
||||
spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size);
|
||||
if (spi)
|
||||
{
|
||||
ret = NtQuerySystemInformation (SystemPagefileInformation, (PVOID) spi,
|
||||
size, &size);
|
||||
if (ret == STATUS_INFO_LENGTH_MISMATCH)
|
||||
{
|
||||
free (spi);
|
||||
spi = (PSYSTEM_PAGEFILE_INFORMATION) malloc (size);
|
||||
if (spi)
|
||||
ret = NtQuerySystemInformation (SystemPagefileInformation,
|
||||
(PVOID) spi, size, &size);
|
||||
}
|
||||
}
|
||||
if (!spi || ret || (!ret && GetLastError () == ERROR_PROC_NOT_FOUND))
|
||||
{
|
||||
swap_total = memory_status.dwTotalPageFile - mem_total;
|
||||
swap_free = memory_status.dwAvailPageFile - mem_total;
|
||||
}
|
||||
else
|
||||
{
|
||||
PSYSTEM_PAGEFILE_INFORMATION spp = spi;
|
||||
do
|
||||
{
|
||||
swap_total += spp->CurrentSize * getpagesize ();
|
||||
swap_free += (spp->CurrentSize - spp->TotalUsed) * getpagesize ();
|
||||
}
|
||||
while (spp->NextEntryOffset
|
||||
&& (spp = (PSYSTEM_PAGEFILE_INFORMATION)
|
||||
((char *) spp + spp->NextEntryOffset)));
|
||||
}
|
||||
if (spi)
|
||||
free (spi);
|
||||
return __small_sprintf (destbuf, " total: used: free:\n"
|
||||
"Mem: %10lu %10lu %10lu\n"
|
||||
"Swap: %10lu %10lu %10lu\n"
|
||||
|
|
|
@ -31,6 +31,7 @@ typedef enum _SYSTEM_INFORMATION_CLASS
|
|||
SystemTimeOfDayInformation = 3,
|
||||
SystemProcessesAndThreadsInformation = 5,
|
||||
SystemProcessorTimes = 8,
|
||||
SystemPagefileInformation = 18,
|
||||
/* There are a lot more of these... */
|
||||
} SYSTEM_INFORMATION_CLASS;
|
||||
|
||||
|
@ -49,6 +50,15 @@ typedef struct _SYSTEM_BASIC_INFORMATION
|
|||
UCHAR NumberProcessors;
|
||||
} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;
|
||||
|
||||
typedef struct _SYSTEM_PAGEFILE_INFORMATION
|
||||
{
|
||||
ULONG NextEntryOffset;
|
||||
ULONG CurrentSize;
|
||||
ULONG TotalUsed;
|
||||
ULONG PeakUsed;
|
||||
UNICODE_STRING FileName;
|
||||
} SYSTEM_PAGEFILE_INFORMATION, *PSYSTEM_PAGEFILE_INFORMATION;
|
||||
|
||||
typedef struct __attribute__ ((aligned (8))) _SYSTEM_PROCESSOR_TIMES
|
||||
{
|
||||
LARGE_INTEGER IdleTime;
|
||||
|
|
Loading…
Reference in New Issue