summaryrefslogtreecommitdiff
path: root/lib/physmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/physmem.c')
-rw-r--r--lib/physmem.c118
1 files changed, 68 insertions, 50 deletions
diff --git a/lib/physmem.c b/lib/physmem.c
index 844817b..6d405f7 100644
--- a/lib/physmem.c
+++ b/lib/physmem.c
@@ -1,12 +1,12 @@
/* Calculate the size of physical memory.
- Copyright (C) 2000, 2001, 2003, 2005, 2006 Free Software
+ Copyright (C) 2000-2001, 2003, 2005-2006, 2009-2016 Free Software
Foundation, Inc.
- This program is free software; you can redistribute it and/or modify
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -14,8 +14,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* Written by Paul Eggert. */
@@ -33,8 +32,11 @@
# include <sys/sysmp.h>
#endif
-#if HAVE_SYS_SYSINFO_H && HAVE_MACHINE_HAL_SYSINFO_H
+#if HAVE_SYS_SYSINFO_H
# include <sys/sysinfo.h>
+#endif
+
+#if HAVE_MACHINE_HAL_SYSINFO_H
# include <machine/hal_sysinfo.h>
#endif
@@ -91,15 +93,23 @@ physmem_total (void)
}
#endif
+#if HAVE_SYSINFO && HAVE_STRUCT_SYSINFO_MEM_UNIT
+ { /* This works on linux. */
+ struct sysinfo si;
+ if (sysinfo(&si) == 0)
+ return (double) si.totalram * si.mem_unit;
+ }
+#endif
+
#if HAVE_PSTAT_GETSTATIC
{ /* This works on hpux11. */
struct pst_static pss;
if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0))
{
- double pages = pss.physical_memory;
- double pagesize = pss.page_size;
- if (0 <= pages && 0 <= pagesize)
- return pages * pagesize;
+ double pages = pss.physical_memory;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
}
}
#endif
@@ -109,10 +119,10 @@ physmem_total (void)
struct rminfo realmem;
if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
{
- double pagesize = sysconf (_SC_PAGESIZE);
- double pages = realmem.physmem;
- if (0 <= pages && 0 <= pagesize)
- return pages * pagesize;
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.physmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
}
}
#endif
@@ -122,12 +132,12 @@ physmem_total (void)
int physmem;
if (getsysinfo (GSI_PHYSMEM, (caddr_t) &physmem, sizeof (physmem),
- NULL, NULL, NULL) == 1)
+ NULL, NULL, NULL) == 1)
{
- double kbytes = physmem;
+ double kbytes = physmem;
- if (0 <= kbytes)
- return kbytes * 1024.0;
+ if (0 <= kbytes)
+ return kbytes * 1024.0;
}
}
#endif
@@ -139,7 +149,7 @@ physmem_total (void)
static int mib[2] = { CTL_HW, HW_PHYSMEM };
if (sysctl (mib, ARRAY_SIZE (mib), &physmem, &len, NULL, 0) == 0
- && len == sizeof (physmem))
+ && len == sizeof (physmem))
return (double) physmem;
}
#endif
@@ -160,20 +170,20 @@ physmem_total (void)
/* Use GlobalMemoryStatusEx if available. */
if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
{
- lMEMORYSTATUSEX lms_ex;
- lms_ex.dwLength = sizeof lms_ex;
- if (!pfnex (&lms_ex))
- return 0.0;
- return (double) lms_ex.ullTotalPhys;
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullTotalPhys;
}
/* Fall back to GlobalMemoryStatus which is always available.
but returns wrong results for physical memory > 4GB. */
else
{
- MEMORYSTATUS ms;
- GlobalMemoryStatus (&ms);
- return (double) ms.dwTotalPhys;
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwTotalPhys;
}
}
#endif
@@ -195,17 +205,25 @@ physmem_available (void)
}
#endif
+#if HAVE_SYSINFO && HAVE_STRUCT_SYSINFO_MEM_UNIT
+ { /* This works on linux. */
+ struct sysinfo si;
+ if (sysinfo(&si) == 0)
+ return ((double) si.freeram + si.bufferram) * si.mem_unit;
+ }
+#endif
+
#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC
{ /* This works on hpux11. */
struct pst_static pss;
struct pst_dynamic psd;
if (0 <= pstat_getstatic (&pss, sizeof pss, 1, 0)
- && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0))
+ && 0 <= pstat_getdynamic (&psd, sizeof psd, 1, 0))
{
- double pages = psd.psd_free;
- double pagesize = pss.page_size;
- if (0 <= pages && 0 <= pagesize)
- return pages * pagesize;
+ double pages = psd.psd_free;
+ double pagesize = pss.page_size;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
}
}
#endif
@@ -215,10 +233,10 @@ physmem_available (void)
struct rminfo realmem;
if (sysmp (MP_SAGET, MPSA_RMINFO, &realmem, sizeof realmem) == 0)
{
- double pagesize = sysconf (_SC_PAGESIZE);
- double pages = realmem.availrmem;
- if (0 <= pages && 0 <= pagesize)
- return pages * pagesize;
+ double pagesize = sysconf (_SC_PAGESIZE);
+ double pages = realmem.availrmem;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
}
}
#endif
@@ -229,11 +247,11 @@ physmem_available (void)
if (table (TBL_VMSTATS, 0, &vmstats, 1, sizeof (vmstats)) == 1)
{
- double pages = vmstats.free_count;
- double pagesize = vmstats.pagesize;
+ double pages = vmstats.free_count;
+ double pagesize = vmstats.pagesize;
- if (0 <= pages && 0 <= pagesize)
- return pages * pagesize;
+ if (0 <= pages && 0 <= pagesize)
+ return pages * pagesize;
}
}
#endif
@@ -245,7 +263,7 @@ physmem_available (void)
static int mib[2] = { CTL_HW, HW_USERMEM };
if (sysctl (mib, ARRAY_SIZE (mib), &usermem, &len, NULL, 0) == 0
- && len == sizeof (usermem))
+ && len == sizeof (usermem))
return (double) usermem;
}
#endif
@@ -261,20 +279,20 @@ physmem_available (void)
/* Use GlobalMemoryStatusEx if available. */
if ((pfnex = (PFN_MS_EX) GetProcAddress (h, "GlobalMemoryStatusEx")))
{
- lMEMORYSTATUSEX lms_ex;
- lms_ex.dwLength = sizeof lms_ex;
- if (!pfnex (&lms_ex))
- return 0.0;
- return (double) lms_ex.ullAvailPhys;
+ lMEMORYSTATUSEX lms_ex;
+ lms_ex.dwLength = sizeof lms_ex;
+ if (!pfnex (&lms_ex))
+ return 0.0;
+ return (double) lms_ex.ullAvailPhys;
}
/* Fall back to GlobalMemoryStatus which is always available.
but returns wrong results for physical memory > 4GB */
else
{
- MEMORYSTATUS ms;
- GlobalMemoryStatus (&ms);
- return (double) ms.dwAvailPhys;
+ MEMORYSTATUS ms;
+ GlobalMemoryStatus (&ms);
+ return (double) ms.dwAvailPhys;
}
}
#endif