Jeremie Courreges-Anglas <[email protected]> writes:
> ++#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) ||
> defined(HW_PHYSMEM64))
> + int64_t physical_memory;
HW_MEMSIZE and HW_PHYSMEM64 return uint64_t, not int64_t.
> ++#elif defined(HAVE_BSD_SYSCTL) && defined(HW_PHYSMEM))
> ++ int physical_memory;
HW_PHYSMEM returns u_long (unsigned long) on DragonFly and FreeBSD.
int or signed long may upset -fsanitize=integer on 32-bit archs.
Note, the code can be simplified via sysconf(3).
--- builtin/gc.c 2019-11-04 05:07:07 UTC
+++ builtin/gc.c
@@ -243,20 +243,27 @@ static uint64_t total_ram(void)
if (!sysinfo(&si))
return si.totalram;
-#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM))
- int64_t physical_memory;
- int mib[2];
- size_t length;
-
- mib[0] = CTL_HW;
+#elif defined(HAVE_BSD_SYSCTL) && (defined(HW_MEMSIZE) ||
defined(HW_PHYSMEM64) || defined(HW_PHYSMEM))
+# if defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)
+ uint64_t physical_memory;
+# else
+ u_long physical_memory;
+# endif
+ int mib[2] = {
+ CTL_HW,
# if defined(HW_MEMSIZE)
- mib[1] = HW_MEMSIZE;
+ HW_MEMSIZE,
+# elif defined(HW_PHYSMEM64)
+ HW_PHYSMEM64,
# else
- mib[1] = HW_PHYSMEM;
+ HW_PHYSMEM,
# endif
- length = sizeof(int64_t);
+ };
+ size_t length = sizeof(mib);
if (!sysctl(mib, 2, &physical_memory, &length, NULL, 0))
return physical_memory;
+#elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE)
+ return (uint64_t)sysconf(_SC_PHYS_PAGES) * sysconf(_SC_PAGESIZE);
#elif defined(GIT_WINDOWS_NATIVE)
MEMORYSTATUSEX memInfo;