1#
2# SYNOPSIS
3#
4#   TUKLIB_PHYSMEM
5#
6# DESCRIPTION
7#
8#   Check how to get the amount of physical memory.
9#   This information is used in tuklib_physmem.c.
10#
11#   Supported methods:
12#
13#     - Windows (including Cygwin), OS/2, DJGPP (DOS), and OpenVMS have
14#       operating-system specific functions.
15#
16#     - AIX has _system_configuration.physmem.
17#
18#     - sysconf() works on GNU/Linux and Solaris, and possibly on
19#       some BSDs.
20#
21#     - BSDs use sysctl().
22#
23#     - Tru64 uses getsysinfo().
24#
25#     - HP-UX uses pstat_getstatic().
26#
27#     - IRIX has setinvent_r(), getinvent_r(), and endinvent_r().
28#
29#     - sysinfo() works on Linux/dietlibc and probably on other Linux
30#       systems whose libc may lack sysconf().
31#
32# COPYING
33#
34#   Author: Lasse Collin
35#
36#   This file has been put into the public domain.
37#   You can do whatever you want with this file.
38#
39
40AC_DEFUN_ONCE([TUKLIB_PHYSMEM], [
41AC_REQUIRE([TUKLIB_COMMON])
42
43# sys/param.h might be needed by sys/sysctl.h.
44AC_CHECK_HEADERS([sys/param.h])
45
46AC_CACHE_CHECK([how to detect the amount of physical memory],
47	[tuklib_cv_physmem_method], [
48
49# Maybe checking $host_os would be enough but this matches what
50# tuklib_physmem.c does.
51#
52# NOTE: IRIX has a compiler that doesn't error out with #error, so use
53# a non-compilable text instead of #error to generate an error.
54AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
55#if defined(_WIN32) || defined(__CYGWIN__) || defined(__OS2__) \
56		|| defined(__DJGPP__) || defined(__VMS)
57int main(void) { return 0; }
58#else
59compile error
60#endif
61]])], [tuklib_cv_physmem_method=special], [
62
63# Look for AIX-specific solution before sysconf(), because the test
64# for sysconf() will pass on AIX but won't actually work
65# (sysconf(_SC_PHYS_PAGES) compiles but always returns -1 on AIX).
66AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
67#include <sys/systemcfg.h>
68
69int
70main(void)
71{
72	(void)_system_configuration.physmem;
73	return 0;
74}
75]])], [tuklib_cv_physmem_method=aix], [
76
77AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
78#include <unistd.h>
79int
80main(void)
81{
82	long i;
83	i = sysconf(_SC_PAGESIZE);
84	i = sysconf(_SC_PHYS_PAGES);
85	return 0;
86}
87]])], [tuklib_cv_physmem_method=sysconf], [
88
89AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
90#include <sys/types.h>
91#ifdef HAVE_SYS_PARAM_H
92#	include <sys/param.h>
93#endif
94#include <sys/sysctl.h>
95int
96main(void)
97{
98	int name[2] = { CTL_HW, HW_PHYSMEM };
99	unsigned long mem;
100	size_t mem_ptr_size = sizeof(mem);
101	sysctl(name, 2, &mem, &mem_ptr_size, NULL, 0);
102	return 0;
103}
104]])], [tuklib_cv_physmem_method=sysctl], [
105
106AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
107#include <sys/sysinfo.h>
108#include <machine/hal_sysinfo.h>
109
110int
111main(void)
112{
113	int memkb;
114	int start = 0;
115	getsysinfo(GSI_PHYSMEM, (caddr_t)&memkb, sizeof(memkb), &start);
116	return 0;
117}
118]])], [tuklib_cv_physmem_method=getsysinfo],[
119
120AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
121#include <sys/param.h>
122#include <sys/pstat.h>
123
124int
125main(void)
126{
127	struct pst_static pst;
128	pstat_getstatic(&pst, sizeof(pst), 1, 0);
129	(void)pst.physical_memory;
130	(void)pst.page_size;
131	return 0;
132}
133]])], [tuklib_cv_physmem_method=pstat_getstatic],[
134
135AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
136#include <invent.h>
137int
138main(void)
139{
140	inv_state_t *st = NULL;
141	setinvent_r(&st);
142	getinvent_r(st);
143	endinvent_r(st);
144	return 0;
145}
146]])], [tuklib_cv_physmem_method=getinvent_r], [
147
148# This version of sysinfo() is Linux-specific. Some non-Linux systems have
149# different sysinfo() so we must check $host_os.
150case $host_os in
151	linux*)
152		AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
153#include <sys/sysinfo.h>
154int
155main(void)
156{
157	struct sysinfo si;
158	sysinfo(&si);
159	return 0;
160}
161		]])], [
162			tuklib_cv_physmem_method=sysinfo
163		], [
164			tuklib_cv_physmem_method=unknown
165		])
166		;;
167	*)
168		tuklib_cv_physmem_method=unknown
169		;;
170esac
171])])])])])])])])
172
173case $tuklib_cv_physmem_method in
174	aix)
175		AC_DEFINE([TUKLIB_PHYSMEM_AIX], [1],
176			[Define to 1 if the amount of physical memory
177			can be detected with _system_configuration.physmem.])
178		;;
179	sysconf)
180		AC_DEFINE([TUKLIB_PHYSMEM_SYSCONF], [1],
181			[Define to 1 if the amount of physical memory can
182			be detected with sysconf(_SC_PAGESIZE) and
183			sysconf(_SC_PHYS_PAGES).])
184		;;
185	sysctl)
186		AC_DEFINE([TUKLIB_PHYSMEM_SYSCTL], [1],
187			[Define to 1 if the amount of physical memory can
188			be detected with sysctl().])
189		;;
190	getsysinfo)
191		AC_DEFINE([TUKLIB_PHYSMEM_GETSYSINFO], [1],
192			[Define to 1 if the amount of physical memory can
193			be detected with getsysinfo().])
194		;;
195	pstat_getstatic)
196		AC_DEFINE([TUKLIB_PHYSMEM_PSTAT_GETSTATIC], [1],
197			[Define to 1 if the amount of physical memory can
198			be detected with pstat_getstatic().])
199		;;
200	getinvent_r)
201		AC_DEFINE([TUKLIB_PHYSMEM_GETINVENT_R], [1],
202			[Define to 1 if the amount of physical memory
203			can be detected with getinvent_r().])
204		;;
205	sysinfo)
206		AC_DEFINE([TUKLIB_PHYSMEM_SYSINFO], [1],
207			[Define to 1 if the amount of physical memory
208			can be detected with Linux sysinfo().])
209		;;
210esac
211])dnl
212