On 18/12/2015 09:41, Mike Williams wrote:
use GlobalMemoryStatus() just for old compilers like this:

#ifdef MEMORYSTATUSEX
   /* Use GlobalMemoryStatusEx() for recent compilers */
#else
   /* Use GlobalMemoryStatus() for old compilers */
#endif

Win2K does not support GlobalMemoryStatusEx().  The default Windows
build sets WINVER to 0x0400 to support Win2K compatible builds and this
excludes MEMORYSTATUSEX, so it is not new/compilers but old/new versions
of NT.

Rats, another silent regression in the code base. The check #ifdef MEMORYSTATUSEX excludes the protected code when building with Visual C. This is the second time in recent weeks I have stumbled into code that has checks for MingW builds that have ended up excluding code when built with VC. I wonder how many other places in the code have the same problem. Sigh, another general code review to do.

Anyway, patch v0.3 so that GlobalMemoryStatusEx() gets called when using VC. Can someone check that it still compiles as expected with MingW please.

TTFN

Mike
--
AUTHORITY(n): someone who's guessed right more than once.

--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- You received this message because you are subscribed to the Google Groups "vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.
diff --git a/src/os_win32.c b/src/os_win32.c
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -5858,6 +5858,66 @@ mch_breakcheck(void)
 #endif
 }
 
+/* Physical RAM to leave for the OS */
+#define WINNT_RESERVE_BYTES     (256*1024*1024)
+#define WIN95_RESERVE_BYTES     (8*1024*1024)
+
+/*
+ * How much main memory in KiB that can be used by VIM.
+ */
+/*ARGSUSED*/
+    long_u
+mch_total_mem(int special)
+{
+    PlatformId();
+#if (defined(_MSC_VER) && (WINVER > 0x0400)) || defined(MEMORYSTATUSEX)
+    if (g_PlatformId == VER_PLATFORM_WIN32_NT)
+    {
+        MEMORYSTATUSEX  ms;
+
+        /* Need to use GlobalMemoryStatusEx() when there is more memory than
+         * what fits in 32 bits. But it's not always available. */
+        ms.dwLength = sizeof(MEMORYSTATUSEX);
+        GlobalMemoryStatusEx(&ms);
+        if (ms.ullAvailVirtual < ms.ullTotalPhys)
+        {
+            /* Process address space fits in physical RAM, use all of it */
+            return (long_u)(ms.ullAvailVirtual/1024);
+        }
+        if (ms.ullTotalPhys <= WINNT_RESERVE_BYTES)
+        {
+            /* Catch old NT box or perverse hardware setup */
+            return (long_u)((ms.ullTotalPhys/2)/1024);
+        }
+        /* Use physical RAM less reserve for OS + data */
+        return (long_u)((ms.ullTotalPhys - WINNT_RESERVE_BYTES)/1024);
+    }
+    else
+#endif
+    {
+        /* Pre-XP or 95 OS handling */
+        MEMORYSTATUS    ms;
+        long_u os_reserve_bytes;
+
+        ms.dwLength = sizeof(MEMORYSTATUS);
+        GlobalMemoryStatus(&ms);
+        if (ms.dwAvailVirtual < ms.dwTotalPhys)
+        {
+            /* Process address space fits in physical RAM, use all of it */
+            return (long_u)(ms.dwAvailVirtual/1024);
+        }
+        os_reserve_bytes = (g_PlatformId == VER_PLATFORM_WIN32_NT)
+            ? WINNT_RESERVE_BYTES
+            : WIN95_RESERVE_BYTES;
+        if (ms.dwTotalPhys <= os_reserve_bytes)
+        {
+            /* Catch old boxes or perverse hardware setup */
+            return (long_u)((ms.dwTotalPhys/2)/1024);
+        }
+        /* Use physical RAM less reserve for OS + data */
+        return (long_u)((ms.dwTotalPhys - os_reserve_bytes)/1024);
+    }
+}
 
 #ifdef FEAT_MBYTE
 /*
diff --git a/src/os_win32.h b/src/os_win32.h
--- a/src/os_win32.h
+++ b/src/os_win32.h
@@ -78,6 +78,8 @@
 # define BREAKCHECK_SKIP    1	/* call mch_breakcheck() each time, it's fast */
 #endif
 
+#define HAVE_TOTAL_MEM
+
 #define HAVE_PUTENV		/* at least Bcc 5.2 and MSC have it */
 
 #ifdef FEAT_GUI_W32
diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -43,6 +43,7 @@ void mch_write __ARGS((char_u *s, int le
 void mch_delay __ARGS((long msec, int ignoreinput));
 int mch_remove __ARGS((char_u *name));
 void mch_breakcheck __ARGS((void));
+long_u mch_total_mem __ARGS((int special));
 int mch_wrename __ARGS((WCHAR *wold, WCHAR *wnew));
 int mch_rename __ARGS((const char *pszOldFile, const char *pszNewFile));
 char *default_shell __ARGS((void));

Raspunde prin e-mail lui