diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2010-05-10 19:54:15 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2010-05-10 19:54:15 +0300 |
commit | 6548e304657e77d3a972053db3c41c5daf591113 (patch) | |
tree | c8ae4f8c278d244d9d4f17084b7095beea9ea9dc /m4 | |
parent | Show both elapsed time and estimated remaining time in xz -v. (diff) | |
download | xz-6548e304657e77d3a972053db3c41c5daf591113.tar.xz |
Updates to tuklib_physmem and tuklib_cpucores.
Don't use #error to generate compile error, because some
compilers actually don't take it as an error. This fixes
tuklib_physmem on IRIX.
Fix incorrect error check for sysconf() return values.
Add AIX, HP-UX, and Tru64 specific code to detect the
amount RAM.
Add HP-UX specific code to detect the number of CPU cores.
Thanks a lot to Peter O'Gorman for initial patches,
testing, and debugging these fixes.
Diffstat (limited to 'm4')
-rw-r--r-- | m4/tuklib_cpucores.m4 | 33 | ||||
-rw-r--r-- | m4/tuklib_physmem.m4 | 72 |
2 files changed, 97 insertions, 8 deletions
diff --git a/m4/tuklib_cpucores.m4 b/m4/tuklib_cpucores.m4 index d48f2e5e..9e295c8f 100644 --- a/m4/tuklib_cpucores.m4 +++ b/m4/tuklib_cpucores.m4 @@ -8,8 +8,10 @@ # Check how to find out the number of available CPU cores in the system. # This information is used by tuklib_cpucores.c. # -# Currently this supports sysctl() (BSDs, OS/2) and sysconf() (GNU/Linux, -# Solaris, IRIX, Cygwin). +# Supported methods: +# - sysctl(): BSDs, OS/2 +# - sysconf(): GNU/Linux, Solaris, Tru64, IRIX, AIX, Cygwin +# - pstat_getdynamic(): HP-UX # # COPYING # @@ -63,11 +65,25 @@ main(void) #endif return 0; } -]])], [ - tuklib_cv_cpucores_method=sysconf -], [ +]])], [tuklib_cv_cpucores_method=sysconf], [ + +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include <sys/param.h> +#include <sys/pstat.h> + +int +main(void) +{ + struct pst_dynamic pst; + pstat_getdynamic(&pst, sizeof(pst), 1, 0); + (void)pst.psd_proc_cnt; + return 0; +} +]])], [tuklib_cv_cpucores_method=pstat_getdynamic], [ + tuklib_cv_cpucores_method=unknown -])])]) +])])])]) + case $tuklib_cv_cpucores_method in sysctl) AC_DEFINE([TUKLIB_CPUCORES_SYSCTL], [1], @@ -80,5 +96,10 @@ case $tuklib_cv_cpucores_method in can be detected with sysconf(_SC_NPROCESSORS_ONLN) or sysconf(_SC_NPROC_ONLN).]) ;; + pstat_getdynamic) + AC_DEFINE([TUKLIB_CPUCORES_PSTAT_GETDYNAMIC], [1], + [Define to 1 if the number of available CPU cores + can be detected with pstat_getdynamic().]) + ;; esac ])dnl 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 |