summaryrefslogtreecommitdiff
path: root/m4
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2010-05-10 19:54:15 +0300
committerLasse Collin <lasse.collin@tukaani.org>2010-05-10 19:54:15 +0300
commit6548e304657e77d3a972053db3c41c5daf591113 (patch)
treec8ae4f8c278d244d9d4f17084b7095beea9ea9dc /m4
parenta290cfee3e23f046889c022aa96b4eca2016fdda (diff)
downloadxz-6548e304657e77d3a972053db3c41c5daf591113.tar.gz
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.m433
-rw-r--r--m4/tuklib_physmem.m472
2 files changed, 97 insertions, 8 deletions
diff --git a/m4/tuklib_cpucores.m4 b/m4/tuklib_cpucores.m4
index d48f2e5..9e295c8 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 a8c869f..1249925 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