Hi,

Attached is a patch that sets the maxmem options at startup on Windows OSes based on reported memory availability. It uses a simple heuristic to derive a value to use. The checks for limited memory systems from the dark ages of last century may not be ideal, if anyone is still nursing such a system it would be nice to try the patch on it to see if the reserve numbers need to be tweaked.

HTH - TTFN

Mike
--
OPTIMISM - an optimist is someone who tells you to cheer up when things are going his way.

--
--
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,61 @@ 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)
+{
+#ifdef MEMORYSTATUSEX
+    PlatformId();
+    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
+    {
+       MEMORYSTATUS    ms;
+
+       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);
+       }
+       if (ms.dwTotalPhys < WIN95_RESERVE_BYTES)
+       {
+           /* Catch old 95 box or perverse hardware setup */
+           return (long_u)((ms.dwTotalPhys/2)/1024);
+       }
+       /* Use physical RAM less reserve for OS + data */
+       return (long_u)((ms.dwTotalPhys - WIN95_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