diff options
Diffstat (limited to 'm4/tuklib_physmem.m4')
-rw-r--r-- | m4/tuklib_physmem.m4 | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/m4/tuklib_physmem.m4 b/m4/tuklib_physmem.m4 index a8c869f3..12499256 100644 --- a/m4/tuklib_physmem.m4 +++ b/m4/tuklib_physmem.m4 @@ -13,11 +13,17 @@ # - Windows (including Cygwin), OS/2, DJGPP (DOS), and OpenVMS have # operating-system specific functions. # +# - AIX has _system_configuration.physmem. +# # - sysconf() works on GNU/Linux and Solaris, and possibly on # some BSDs. # # - BSDs use sysctl(). # +# - Tru64 uses getsysinfo(). +# +# - HP-UX uses pstat_getstatic(). +# # - IRIX has setinvent_r(), getinvent_r(), and endinvent_r(). # # - sysinfo() works on Linux/dietlibc and probably on other Linux @@ -42,15 +48,32 @@ AC_CACHE_CHECK([how to detect the amount of physical memory], # Maybe checking $host_os would be enough but this matches what # tuklib_physmem.c does. +# +# NOTE: IRIX has a compiler that doesn't error out with #error, so use +# a non-compilable text instead of #error to generate an error. AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \ || defined(__DJGPP__) || defined(__VMS) int main(void) { return 0; } #else -#error +compile error #endif ]])], [tuklib_cv_physmem_method=special], [ +# Look for AIX-specific solution before sysconf(), because the test +# for sysconf() will pass on AIX but won't actually work +# (sysconf(_SC_PHYS_PAGES) compiles but always returns -1 on AIX). +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include <sys/systemcfg.h> + +int +main(void) +{ + (void)_system_configuration.physmem; + return 0; +} +]])], [tuklib_cv_physmem_method=aix], [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include <unistd.h> int @@ -81,6 +104,35 @@ main(void) ]])], [tuklib_cv_physmem_method=sysctl], [ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include <sys/sysinfo.h> +#include <machine/hal_sysinfo.h> + +int +main(void) +{ + int memkb; + int start = 0; + getsysinfo(GSI_PHYSMEM, (caddr_t)&memkb, sizeof(memkb), &start); + return 0; +} +]])], [tuklib_cv_physmem_method=getsysinfo],[ + +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include <sys/param.h> +#include <sys/pstat.h> + +int +main(void) +{ + struct pst_static pst; + pstat_getstatic(&pst, sizeof(pst), 1, 0); + (void)pst.physical_memory; + (void)pst.page_size; + return 0; +} +]])], [tuklib_cv_physmem_method=pstat_getstatic],[ + +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include <invent.h> int main(void) @@ -116,8 +168,14 @@ main(void) tuklib_cv_physmem_method=unknown ;; esac -])])])])]) +])])])])])])])]) + case $tuklib_cv_physmem_method in + aix) + AC_DEFINE([TUKLIB_PHYSMEM_AIX], [1], + [Define to 1 if the amount of physical memory + can be detected with _system_configuration.physmem.]) + ;; sysconf) AC_DEFINE([TUKLIB_PHYSMEM_SYSCONF], [1], [Define to 1 if the amount of physical memory can @@ -129,6 +187,16 @@ case $tuklib_cv_physmem_method in [Define to 1 if the amount of physical memory can be detected with sysctl().]) ;; + getsysinfo) + AC_DEFINE([TUKLIB_PHYSMEM_GETSYSINFO], [1], + [Define to 1 if the amount of physical memory can + be detected with getsysinfo().]) + ;; + pstat_getstatic) + AC_DEFINE([TUKLIB_PHYSMEM_PSTAT_GETSTATIC], [1], + [Define to 1 if the amount of physical memory can + be detected with pstat_getstatic().]) + ;; getinvent_r) AC_DEFINE([TUKLIB_PHYSMEM_GETINVENT_R], [1], [Define to 1 if the amount of physical memory |