summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-02-27 17:58:20 +0100
committerBram Moolenaar <Bram@vim.org>2018-02-27 17:58:20 +0100
commit988615f26f262d9ef6472c53b48868968a6b6d16 (patch)
tree00bfebcbc2f6fa9a83b1e01f6902d004fad233a6
parent792f0e36593d1ec13ccb8a622ca5542c500577b4 (diff)
patch 8.0.1551: on Mac 'maxmemtot' is set to a weird valuev8.0.1551
Problem: On Mac 'maxmemtot' is set to a weird value. Solution: For Mac use total memory and subtract system memory. For other systems accept both a 32 bit and 64 bit result. (Ozaki Kiichi, closes #2646)
-rw-r--r--src/os_unix.c75
-rw-r--r--src/version.c2
2 files changed, 69 insertions, 8 deletions
diff --git a/src/os_unix.c b/src/os_unix.c
index 3788da9918..59fe77ace0 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -565,6 +565,11 @@ mch_check_messages(void)
# if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
# include <sys/sysinfo.h>
# endif
+# ifdef MACOS_X_DARWIN
+# include <mach/mach_host.h>
+# include <mach/mach_port.h>
+# include <mach/vm_page_size.h>
+# endif
/*
* Return total amount of memory available in Kbyte.
@@ -576,16 +581,70 @@ mch_total_mem(int special UNUSED)
long_u mem = 0;
long_u shiftright = 10; /* how much to shift "mem" right for Kbyte */
+# ifdef MACOS_X_DARWIN
+ {
+ /* Mac (Darwin) way of getting the amount of RAM available */
+ mach_port_t host = mach_host_self();
+ kern_return_t kret;
+# ifdef HOST_VM_INFO64
+ struct vm_statistics64 vm_stat;
+ natural_t count = HOST_VM_INFO64_COUNT;
+
+ kret = host_statistics64(host, HOST_VM_INFO64,
+ (host_info64_t)&vm_stat, &count);
+# else
+ struct vm_statistics vm_stat;
+ natural_t count = HOST_VM_INFO_COUNT;
+
+ kret = host_statistics(host, HOST_VM_INFO,
+ (host_info_t)&vm_stat, &count);
+# endif
+ if (kret == KERN_SUCCESS)
+ /* get the amount of user memory by summing each usage */
+ mem = (long_u)(vm_stat.free_count + vm_stat.active_count
+ + vm_stat.inactive_count
+# ifdef MAC_OS_X_VERSION_10_9
+ + vm_stat.compressor_page_count
+# endif
+ ) * getpagesize();
+ mach_port_deallocate(mach_task_self(), host);
+ }
+# endif
+
# ifdef HAVE_SYSCTL
- int mib[2], physmem;
- size_t len;
+ if (mem == 0)
+ {
+ /* BSD way of getting the amount of RAM available. */
+ int mib[2];
+ size_t len = sizeof(long_u);
+# ifdef HW_USERMEM64
+ long_u physmem;
+# else
+ /* sysctl() may return 32 bit or 64 bit, accept both */
+ union {
+ int_u u32;
+ long_u u64;
+ } physmem;
+# endif
- /* BSD way of getting the amount of RAM available. */
- mib[0] = CTL_HW;
- mib[1] = HW_USERMEM;
- len = sizeof(physmem);
- if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0)
- mem = (long_u)physmem;
+ mib[0] = CTL_HW;
+# ifdef HW_USERMEM64
+ mib[1] = HW_USERMEM64;
+# else
+ mib[1] = HW_USERMEM;
+# endif
+ if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0)
+ {
+# ifdef HW_USERMEM64
+ mem = (long_u)physmem;
+# else
+ if (len == sizeof(physmem.u64))
+ mem = (long_u)physmem.u64;
+ else
+ mem = (long_u)physmem.u32;
+# endif
+ }
+ }
# endif
# if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
diff --git a/src/version.c b/src/version.c
index 048387b26f..389bbb1a53 100644
--- a/src/version.c
+++ b/src/version.c
@@ -779,6 +779,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1551,
+/**/
1550,
/**/
1549,