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;
 

Reply via email to