| # | |
| # SYNOPSIS | |
| # | |
| # TUKLIB_PHYSMEM | |
| # | |
| # DESCRIPTION | |
| # | |
| # Check how to get the amount of physical memory. | |
| # This information is used in tuklib_physmem.c. | |
| # | |
| # Supported methods: | |
| # | |
| # - 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 | |
| # systems whose libc may lack sysconf(). | |
| # | |
| # COPYING | |
| # | |
| # Author: Lasse Collin | |
| # | |
| # This file has been put into the public domain. | |
| # You can do whatever you want with this file. | |
| # | |
| AC_DEFUN_ONCE([TUKLIB_PHYSMEM], [ | |
| AC_REQUIRE([TUKLIB_COMMON]) | |
| # sys/param.h might be needed by sys/sysctl.h. | |
| AC_CHECK_HEADERS([sys/param.h]) | |
| AC_CACHE_CHECK([how to detect the amount of physical memory], | |
| [tuklib_cv_physmem_method], [ | |
| # 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 | |
| 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 | |
| main(void) | |
| { | |
| long i; | |
| i = sysconf(_SC_PAGESIZE); | |
| i = sysconf(_SC_PHYS_PAGES); | |
| return 0; | |
| } | |
| ]])], [tuklib_cv_physmem_method=sysconf], [ | |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | |
| #include <sys/types.h> | |
| #ifdef HAVE_SYS_PARAM_H | |
| # include <sys/param.h> | |
| #endif | |
| #include <sys/sysctl.h> | |
| int | |
| main(void) | |
| { | |
| int name[2] = { CTL_HW, HW_PHYSMEM }; | |
| unsigned long mem; | |
| size_t mem_ptr_size = sizeof(mem); | |
| sysctl(name, 2, &mem, &mem_ptr_size, NULL, 0); | |
| return 0; | |
| } | |
| ]])], [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) | |
| { | |
| 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 | |
| linux*) | |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ | |
| #include <sys/sysinfo.h> | |
| int | |
| main(void) | |
| { | |
| struct sysinfo si; | |
| sysinfo(&si); | |
| return 0; | |
| } | |
| ]])], [ | |
| tuklib_cv_physmem_method=sysinfo | |
| ], [ | |
| tuklib_cv_physmem_method=unknown | |
| ]) | |
| ;; | |
| *) | |
| 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 | |
| be detected with sysconf(_SC_PAGESIZE) and | |
| sysconf(_SC_PHYS_PAGES).]) | |
| ;; | |
| sysctl) | |
| AC_DEFINE([TUKLIB_PHYSMEM_SYSCTL], [1], | |
| [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 | |
| can be detected with getinvent_r().]) | |
| ;; | |
| sysinfo) | |
| AC_DEFINE([TUKLIB_PHYSMEM_SYSINFO], [1], | |
| [Define to 1 if the amount of physical memory | |
| can be detected with Linux sysinfo().]) | |
| ;; | |
| esac | |
| ])dnl |