On Tue, 2019-11-05 at 09:17 +0100, Jan Beich wrote:
> 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);

size_t length = sizeof(physical_memory);

>       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