diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2003-02-27 13:44:27 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2003-02-27 13:44:27 +0000 |
commit | ed935c35314a6fe3b0c699bf642c704655873d49 (patch) | |
tree | 3d4eec08b7c2ca7e4fabab8aa891b9862ed4c108 /libiberty/physmem.c | |
parent | 3894fe320778cf2a534db5ea75e52112c40d7196 (diff) | |
download | gcc-ed935c35314a6fe3b0c699bf642c704655873d49.tar.gz |
physmem.c (physmem_total): Add _WIN32 support.
2003-02-24 Danny Smith <dannysmith@users.source.forge.net>
* physmem.c (physmem_total): Add _WIN32 support.
(physmem_available): Likewise.
From-SVN: r63504
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 621e281f78a..ec5a18a0920 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; } |