Add IRIX-specific code to tuklib_physmem and tuklib_cpucores.
authorLasse Collin <lasse.collin@tukaani.org>
Tue, 12 Jan 2010 14:18:14 +0000 (16:18 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Tue, 12 Jan 2010 14:18:14 +0000 (16:18 +0200)
This is untested but it will get tested soon and, if needed,
fixed before 5.0.0.

Thanks to Stuart Shelton.

m4/tuklib_cpucores.m4
m4/tuklib_physmem.m4
src/common/tuklib_cpucores.c
src/common/tuklib_physmem.c

index bb33c6f..d48f2e5 100644 (file)
@@ -9,7 +9,7 @@
 #   This information is used by tuklib_cpucores.c.
 #
 #   Currently this supports sysctl() (BSDs, OS/2) and sysconf() (GNU/Linux,
-#   Solaris, Cygwin).
+#   Solaris, IRIX, Cygwin).
 #
 # COPYING
 #
@@ -54,7 +54,13 @@ int
 main(void)
 {
        long i;
+#ifdef _SC_NPROCESSORS_ONLN
+       /* Many systems using sysconf() */
        i = sysconf(_SC_NPROCESSORS_ONLN);
+#else
+       /* IRIX */
+       i = sysconf(_SC_NPROC_ONLN);
+#endif
        return 0;
 }
 ]])], [
@@ -71,7 +77,8 @@ case $tuklib_cv_cpucores_method in
        sysconf)
                AC_DEFINE([TUKLIB_CPUCORES_SYSCONF], [1],
                        [Define to 1 if the number of available CPU cores
-                       can be detected with sysconf(_SC_NPROCESSORS_ONLN).])
+                       can be detected with sysconf(_SC_NPROCESSORS_ONLN)
+                       or sysconf(_SC_NPROC_ONLN).])
                ;;
 esac
 ])dnl
index 59a645a..a8c869f 100644 (file)
@@ -18,6 +18,8 @@
 #
 #     - BSDs use sysctl().
 #
+#     - IRIX has setinvent_r(), getinvent_r(), and endinvent_r().
+#
 #     - sysinfo() works on Linux/dietlibc and probably on other Linux
 #       systems whose libc may lack sysconf().
 #
@@ -78,6 +80,19 @@ main(void)
 }
 ]])], [tuklib_cv_physmem_method=sysctl], [
 
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <invent.h>
+int
+main(void)
+{
+       inv_state_t *st = NULL;
+       setinvent_r(&st);
+       getinvent_r(st);
+       endinvent_r(st);
+       return 0;
+}
+]])], [tuklib_cv_physmem_method=getinvent_r], [
+
 # This version of sysinfo() is Linux-specific. Some non-Linux systems have
 # different sysinfo() so we must check $host_os.
 case $host_os in
@@ -101,7 +116,7 @@ main(void)
                tuklib_cv_physmem_method=unknown
                ;;
 esac
-])])])])
+])])])])])
 case $tuklib_cv_physmem_method in
        sysconf)
                AC_DEFINE([TUKLIB_PHYSMEM_SYSCONF], [1],
@@ -114,6 +129,11 @@ case $tuklib_cv_physmem_method in
                        [Define to 1 if the amount of physical memory can
                        be detected with sysctl().])
                ;;
+       getinvent_r)
+               AC_DEFINE([TUKLIB_PHYSMEM_GETINVENT_R], [1],
+                       [Define to 1 if the amount of physical memory
+                       can be detected with getinvent_r().])
+               ;;
        sysinfo)
                AC_DEFINE([TUKLIB_PHYSMEM_SYSINFO], [1],
                        [Define to 1 if the amount of physical memory
index 0a8081f..e35d9bc 100644 (file)
@@ -37,7 +37,13 @@ tuklib_cpucores(void)
                ret = (uint32_t)cpus;
 
 #elif defined(TUKLIB_CPUCORES_SYSCONF)
+#      ifdef _SC_NPROCESSORS_ONLN
+       // Most systems
        const long cpus = sysconf(_SC_NPROCESSORS_ONLN);
+#      else
+       // IRIX
+       const long cpus = sysconf(_SC_NPROC_ONLN);
+#      endif
        if (cpus > 0)
                ret = (uint32_t)cpus;
 #endif
index b2d2128..1536e6e 100644 (file)
 #      endif
 #      include <sys/sysctl.h>
 
+// IRIX
+#elif defined(TUKLIB_PHYSMEM_GETINVENT_R)
+#      include <invent.h>
+
 // This sysinfo() is Linux-specific.
 #elif defined(TUKLIB_PHYSMEM_SYSINFO)
 #      include <sys/sysinfo.h>
@@ -136,6 +140,21 @@ tuklib_physmem(void)
                        ret = mem.u32;
        }
 
+#elif defined(TUKLIB_PHYSMEM_GETINVENT_R)
+       inv_state_t *st = NULL;
+       if (setinvent_r(&st) != -1) {
+               inventory_t *i;
+               while ((i = getinvent_r(st)) != NULL) {
+                       if (i->inv_class == INV_MEMORY
+                                       && i->inv_type == INV_MAIN_MB) {
+                               ret = (uint64_t)i->inv_state << 20;
+                               break;
+                       }
+               }
+
+               endinvent_r(st);
+       }
+
 #elif defined(TUKLIB_PHYSMEM_SYSINFO)
        struct sysinfo si;
        if (sysinfo(&si) == 0)