]> granicus.if.org Git - vim/commitdiff
patch 7.4.1033 v7.4.1033
authorBram Moolenaar <Bram@vim.org>
Sat, 2 Jan 2016 20:11:51 +0000 (21:11 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 2 Jan 2016 20:11:51 +0000 (21:11 +0100)
Problem:    Memory use on MS-Windows is very conservative.
Solution:   Use the global memory status to estimate amount of memory.
            (Mike Williams)

src/os_win32.c
src/os_win32.h
src/proto/os_win32.pro
src/version.c

index 2cfd8f34ae75125fb0d075c52ff5879e110dbc28..69623f9808ff5fadc16d246b343f3d13fe31bb7c 100644 (file)
@@ -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
 /*
index 8553910e3d6a5132ccb9dfdc57f88c751200499c..a6ac891765cb2857118d85244cac5677c7579d34 100644 (file)
@@ -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
index 1431f69da5fe22d61911a29a76ea572070c9ba9b..5816fc91c4bb27b5ab8fba31d325066b24194436 100644 (file)
@@ -43,6 +43,7 @@ void mch_write __ARGS((char_u *s, int len));
 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));
index 72aa418d54e827688388656dedee53ed474db6dc..e49fadb618bc7796b246ad22c623db13009d59b2 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1033,
 /**/
     1032,
 /**/