diff options
author | DJ Delorie <dj@redhat.com> | 2003-02-27 15:17:29 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2003-02-27 15:17:29 +0000 |
commit | ef8038066b973eed9c7fcfc963beb5d5c1b4663b (patch) | |
tree | 428c94594528c749ff0735c191c9654220028782 /libiberty/physmem.c | |
parent | ad18820186a8925ae3850e45cb83a60d67c469c7 (diff) | |
download | gdb-ef8038066b973eed9c7fcfc963beb5d5c1b4663b.zip gdb-ef8038066b973eed9c7fcfc963beb5d5c1b4663b.tar.gz gdb-ef8038066b973eed9c7fcfc963beb5d5c1b4663b.tar.bz2 |
merge from gcc
Diffstat (limited to 'libiberty/physmem.c')
-rw-r--r-- | libiberty/physmem.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/libiberty/physmem.c b/libiberty/physmem.c index 621e281..ec5a18a 100644 --- a/libiberty/physmem.c +++ b/libiberty/physmem.c @@ -56,6 +56,25 @@ # include <sys/systemcfg.h> #endif +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +/* MEMORYSTATUSEX is missing from older windows headers, so define + a local replacement. */ +typedef struct { + DWORD dwLength; + DWORD dwMemoryLoad; + DWORDLONG ullTotalPhys; + DWORDLONG ullAvailPhys; + DWORDLONG ullTotalPageFile; + DWORDLONG ullAvailPageFile; + DWORDLONG ullTotalVirtual; + DWORDLONG ullAvailVirtual; + DWORDLONG ullAvailExtendedVirtual; +} lMEMORYSTATUSEX; +typedef WINBOOL (WINAPI *PFN_MS_EX) (lMEMORYSTATUSEX*); +#endif + #include "libiberty.h" /* Return the total amount of physical memory. */ @@ -129,6 +148,35 @@ physmem_total () return _system_configuration.physmem; #endif +#if defined _WIN32 + { /* this works on windows */ + PFN_MS_EX pfnex; + HMODULE h = GetModuleHandle("kernel32.dll"); + + if (!h) + return 0.0; + + /* Use GlobalMemoryStatusEx if available. */ + if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) + { + lMEMORYSTATUSEX lms_ex; + lms_ex.dwLength = sizeof lms_ex; + if (!pfnex (&lms_ex)) + return 0.0; + return (double)lms_ex.ullTotalPhys; + } + + /* Fall back to GlobalMemoryStatus which is always available. + but returns wrong results for physical memory > 4GB. */ + else + { + MEMORYSTATUS ms; + GlobalMemoryStatus (&ms); + return (double)ms.dwTotalPhys; + } + } +#endif + /* Return 0 if we can't determine the value. */ return 0; } @@ -201,6 +249,35 @@ physmem_available () } #endif +#if defined _WIN32 + { /* this works on windows */ + PFN_MS_EX pfnex; + HMODULE h = GetModuleHandle ("kernel32.dll"); + + if (!h) + return 0.0; + + /* Use GlobalMemoryStatusEx if available. */ + if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx"))) + { + lMEMORYSTATUSEX lms_ex; + lms_ex.dwLength = sizeof lms_ex; + if (!pfnex (&lms_ex)) + return 0.0; + return (double) lms_ex.ullAvailPhys; + } + + /* Fall back to GlobalMemoryStatus which is always available. + but returns wrong results for physical memory > 4GB */ + else + { + MEMORYSTATUS ms; + GlobalMemoryStatus (&ms); + return (double)ms.dwAvailPhys; + } + } +#endif + /* Guess 25% of physical memory. */ return physmem_total () / 4; } |