diff options
author | Jim Meyering <jim@meyering.net> | 2001-11-16 09:20:25 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2001-11-16 09:20:25 +0000 |
commit | e7d469d6633a5b0a49de8d2b0b6d6b229413a0ec (patch) | |
tree | b93f96da04910462ad95e4d4000d1cd14befeb64 /lib | |
parent | 3fad422ee53de6bbb7912c68faaa9f7d03971119 (diff) | |
download | coreutils-e7d469d6633a5b0a49de8d2b0b6d6b229413a0ec.tar.xz |
[HAVE_SYS_PSTAT_H]: Include <sys/pstat.h>.
(physmem_total) [HAVE_PSTAT_GETSTATIC]: If sysconf couldn't be used to
determine the amount of total physical memory, use pstat_getstatic.
HPUX-11 doesn't define _SC_PHYS_PAGES.
(physmem_available) [HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC]:
If sysconf couldn't be used to determine the amount of available
physical memory, use both pstat_getstatic and pstat_getdynamic.
Based on a patch from Bob Proulx.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/physmem.c | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/lib/physmem.c b/lib/physmem.c index d0e252f1e..4219c7011 100644 --- a/lib/physmem.c +++ b/lib/physmem.c @@ -1,5 +1,5 @@ /* Calculate the size of physical memory. - Copyright 2000 Free Software Foundation, Inc. + Copyright 2000, 2001 Free Software Foundation, Inc. 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 @@ -27,15 +27,34 @@ # include <unistd.h> #endif +#if HAVE_SYS_PSTAT_H +# include <sys/pstat.h> +#endif + /* Return the total amount of physical memory. */ double physmem_total (void) { #if defined _SC_PHYS_PAGES && defined _SC_PAGESIZE - double pages = sysconf (_SC_PHYS_PAGES); - double pagesize = sysconf (_SC_PAGESIZE); - if (0 <= pages && 0 <= pagesize) - return pages * pagesize; + { + double pages = sysconf (_SC_PHYS_PAGES); + double pagesize = sysconf (_SC_PAGESIZE); + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } +#endif + +#if HAVE_PSTAT_GETSTATIC + { + 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; + } + } #endif /* Guess 64 MB. It's probably an older host, so guess small. */ @@ -47,10 +66,27 @@ double physmem_available (void) { #if defined _SC_AVPHYS_PAGES && defined _SC_PAGESIZE - double pages = sysconf (_SC_AVPHYS_PAGES); - double pagesize = sysconf (_SC_PAGESIZE); - if (0 <= pages && 0 <= pagesize) - return pages * pagesize; + { + double pages = sysconf (_SC_AVPHYS_PAGES); + double pagesize = sysconf (_SC_PAGESIZE); + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } +#endif + +#if HAVE_PSTAT_GETSTATIC && HAVE_PSTAT_GETDYNAMIC + { + 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)) + { + double pages = psd.psd_free; + double pagesize = pss.page_size; + if (0 <= pages && 0 <= pagesize) + return pages * pagesize; + } + } #endif /* Guess 25% of physical memory. */ |