summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-01-02 21:11:51 +0100
committerBram Moolenaar <Bram@vim.org>2016-01-02 21:11:51 +0100
commitee2739787f1e996739541bb60e6003b892497e03 (patch)
treea1432705205c0e7ea65bdcc4162801e1f4cebc9e
parentcbfe32953aea09d35d9ac7e5865c915b14e310c1 (diff)
patch 7.4.1033v7.4.1033
Problem: Memory use on MS-Windows is very conservative. Solution: Use the global memory status to estimate amount of memory. (Mike Williams)
-rw-r--r--src/os_win32.c60
-rw-r--r--src/os_win32.h2
-rw-r--r--src/proto/os_win32.pro1
-rw-r--r--src/version.c2
4 files changed, 65 insertions, 0 deletions
diff --git a/src/os_win32.c b/src/os_win32.c
index 2cfd8f34ae..69623f9808 100644
--- 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
index 8553910e3d..a6ac891765 100644
--- 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
index 1431f69da5..5816fc91c4 100644
--- a/src/proto/os_win32.pro
+++ b/src/proto/os_win32.pro
@@ -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));
diff --git a/src/version.c b/src/version.c
index 72aa418d54..e49fadb618 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1033,
+/**/
1032,
/**/
1031,