From 6548e304657e77d3a972053db3c41c5daf591113 Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Mon, 10 May 2010 19:54:15 +0300 Subject: 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. --- src/common/tuklib_cpucores.c | 14 ++++++++++++-- src/common/tuklib_physmem.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/common/tuklib_cpucores.c b/src/common/tuklib_cpucores.c index e35d9bc7..1da13df7 100644 --- a/src/common/tuklib_cpucores.c +++ b/src/common/tuklib_cpucores.c @@ -20,6 +20,11 @@ #elif defined(TUKLIB_CPUCORES_SYSCONF) # include + +// HP-UX +#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) +# include +# include #endif @@ -34,7 +39,7 @@ tuklib_cpucores(void) size_t cpus_size = sizeof(cpus); if (sysctl(name, 2, &cpus, &cpus_size, NULL, 0) != -1 && cpus_size == sizeof(cpus) && cpus > 0) - ret = (uint32_t)cpus; + ret = cpus; #elif defined(TUKLIB_CPUCORES_SYSCONF) # ifdef _SC_NPROCESSORS_ONLN @@ -45,7 +50,12 @@ tuklib_cpucores(void) const long cpus = sysconf(_SC_NPROC_ONLN); # endif if (cpus > 0) - ret = (uint32_t)cpus; + ret = cpus; + +#elif defined(TUKLIB_CPUCORES_PSTAT_GETDYNAMIC) + struct pst_dynamic pst; + if (pstat_getdynamic(&pst, sizeof(pst), 1, 0) != -1) + ret = pst.psd_proc_cnt; #endif return ret; diff --git a/src/common/tuklib_physmem.c b/src/common/tuklib_physmem.c index 1536e6e5..623b6e70 100644 --- a/src/common/tuklib_physmem.c +++ b/src/common/tuklib_physmem.c @@ -33,6 +33,10 @@ # include # include +// AIX +#elif defined(TUKLIB_PHYSMEM_AIX) +# include + #elif defined(TUKLIB_PHYSMEM_SYSCONF) # include @@ -42,6 +46,16 @@ # endif # include +// Tru64 +#elif defined(TUKLIB_PHYSMEM_GETSYSINFO) +# include +# include + +// HP-UX +#elif defined(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) +# include +# include + // IRIX #elif defined(TUKLIB_PHYSMEM_GETINVENT_R) # include @@ -105,10 +119,13 @@ tuklib_physmem(void) if (LIB$GETSYI(&val, &vms_mem, 0, 0, 0, 0) == SS$_NORMAL) ret = (uint64_t)vms_mem * 8192; +#elif defined(TUKLIB_PHYSMEM_AIX) + ret = _system_configuration.physmem; + #elif defined(TUKLIB_PHYSMEM_SYSCONF) const long pagesize = sysconf(_SC_PAGESIZE); const long pages = sysconf(_SC_PHYS_PAGES); - if (pagesize != -1 || pages != -1) + if (pagesize != -1 && pages != -1) // According to docs, pagesize * pages can overflow. // Simple case is 32-bit box with 4 GiB or more RAM, // which may report exactly 4 GiB of RAM, and "long" @@ -140,6 +157,20 @@ tuklib_physmem(void) ret = mem.u32; } +#elif defined(TUKLIB_PHYSMEM_GETSYSINFO) + // Docs are unclear if "start" is needed, but it doesn't hurt + // much to have it. + int memkb; + int start = 0; + if (getsysinfo(GSI_PHYSMEM, (caddr_t)&memkb, sizeof(memkb), &start) + != -1) + ret = (uint64_t)memkb * 1024; + +#elif defined(TUKLIB_PHYSMEM_PSTAT_GETSTATIC) + struct pst_static pst; + if (pstat_getstatic(&pst, sizeof(pst), 1, 0) != -1) + ret = (uint64_t)pst.physical_memory * (uint64_t)pst.page_size; + #elif defined(TUKLIB_PHYSMEM_GETINVENT_R) inv_state_t *st = NULL; if (setinvent_r(&st) != -1) { -- cgit v1.2.3