diff options
author | ghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-21 00:27:04 +0000 |
---|---|---|
committer | ghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-21 00:27:04 +0000 |
commit | 5cf67f1b7a6552096f9098bbe02854c1a40b0f0b (patch) | |
tree | d7ff9fd0ca6913444d43463d7cf61e8571d20621 /libiberty/physmem.c | |
parent | cba2c4fb24ef37b040ba623de91c606b8491a662 (diff) | |
download | gcc-5cf67f1b7a6552096f9098bbe02854c1a40b0f0b.tar.gz |
include:
* libiberty.h (physmem_total, physmem_available): Prototype.
libiberty:
* Makefile.in (CFILES): Add physmem.c.
(REQUIRED_OFILES): Add physmem.o.
* configure.in: Check for sys/pstat.h.
(checkfuncs): Add pstat_getstatic and pstat_getdynamic.
* physmem.c: New file, copied from textutils.
* config.in, configure: Regenerated.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63198 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/physmem.c')
-rw-r--r-- | libiberty/physmem.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/libiberty/physmem.c b/libiberty/physmem.c new file mode 100644 index 00000000000..c540d18d0dc --- /dev/null +++ b/libiberty/physmem.c @@ -0,0 +1,92 @@ +/* Calculate the size of physical memory. + 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 + the Free Software Foundation; either version 2, 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 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if HAVE_UNISTD_H +# 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; + } +#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 + + /* Return 0 if we can't determine the value. */ + return 0; +} + +/* Return the amount of physical memory available. */ +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; + } +#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. */ + return physmem_total () / 4; +} |