From ef8038066b973eed9c7fcfc963beb5d5c1b4663b Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Thu, 27 Feb 2003 15:17:29 +0000 Subject: [PATCH] merge from gcc --- libiberty/ChangeLog | 5 +++ libiberty/physmem.c | 77 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 552355c40a..2537c42ca5 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,8 @@ +2003-02-24 Danny Smith + + * physmem.c (physmem_total): Add _WIN32 support. + (physmem_available): Likewise. + 2003-02-24 Rainer Orth * physmem.c (physmem_total) [HAVE_GETSYSINFO]: Test for diff --git a/libiberty/physmem.c b/libiberty/physmem.c index 621e281f78..ec5a18a092 100644 --- a/libiberty/physmem.c +++ b/libiberty/physmem.c @@ -56,6 +56,25 @@ # include #endif +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +/* 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; }