diff options
-rw-r--r-- | libiberty/ChangeLog | 5 | ||||
-rw-r--r-- | libiberty/physmem.c | 77 |
2 files changed, 82 insertions, 0 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 552355c..2537c42 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2003-02-24 Danny Smith <dannysmith@users.source.forge.net> + + * physmem.c (physmem_total): Add _WIN32 support. + (physmem_available): Likewise. + 2003-02-24 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> * physmem.c (physmem_total) [HAVE_GETSYSINFO]: Test for 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; } |