diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-01-02 21:11:51 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-01-02 21:11:51 +0100 |
commit | ee2739787f1e996739541bb60e6003b892497e03 (patch) | |
tree | a1432705205c0e7ea65bdcc4162801e1f4cebc9e | |
parent | cbfe32953aea09d35d9ac7e5865c915b14e310c1 (diff) | |
download | vim-git-ee2739787f1e996739541bb60e6003b892497e03.tar.gz |
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.c | 60 | ||||
-rw-r--r-- | src/os_win32.h | 2 | ||||
-rw-r--r-- | src/proto/os_win32.pro | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 65 insertions, 0 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 2cfd8f34a..69623f980 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 8553910e3..a6ac89176 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 1431f69da..5816fc91c 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 72aa418d5..e49fadb61 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, |