From: dj Date: Thu, 27 Feb 2003 15:17:29 +0000 (+0000) Subject: merge from gcc X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=00055cb17365c3a3512a059a70d82d64c0f555ab;p=pf3gnuchains%2Fpf3gnuchains3x.git merge from gcc --- 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; }