merge from gcc
authorDJ Delorie <dj@redhat.com>
Thu, 27 Feb 2003 15:17:29 +0000 (15:17 +0000)
committerDJ Delorie <dj@redhat.com>
Thu, 27 Feb 2003 15:17:29 +0000 (15:17 +0000)
libiberty/ChangeLog
libiberty/physmem.c

index 552355c40aade479f430665bce857bc924a24836..2537c42ca5f3f4dbc2a27395e15d4c5656356f00 100644 (file)
@@ -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
index 621e281f78ad697e2483f630123884cacbeaf66d..ec5a18a09203757b90a02473351d83bc3965db79 100644 (file)
 # 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;
 }