diff options
Diffstat (limited to 'libiberty')
-rw-r--r-- | libiberty/ChangeLog | 10 | ||||
-rw-r--r-- | libiberty/Makefile.in | 4 | ||||
-rw-r--r-- | libiberty/config.in | 5 | ||||
-rwxr-xr-x | libiberty/configure | 4 | ||||
-rw-r--r-- | libiberty/configure.in | 4 | ||||
-rw-r--r-- | libiberty/physmem.c | 92 |
6 files changed, 112 insertions, 7 deletions
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index f4703805c72..2c72bfc6d90 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,13 @@ +2003-02-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * 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. + 2003-02-20 Daniel Jacobowitz <drow@mvista.com> * Makefile.in (CFILES): Add lrealpath.c. diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in index c5763579a86..a12ebb156f4 100644 --- a/libiberty/Makefile.in +++ b/libiberty/Makefile.in @@ -145,7 +145,7 @@ CFILES = alloca.c argv.c asprintf.c atexit.c \ partition.c \ pex-djgpp.c pex-mpw.c pex-msdos.c pex-os2.c \ pex-unix.c pex-win32.c \ - putenv.c \ + physmem.c putenv.c \ random.c regex.c rename.c rindex.c \ safe-ctype.c setenv.c sigsetmask.c sort.c spaces.c \ splay-tree.c strcasecmp.c strchr.c strdup.c strerror.c \ @@ -170,7 +170,7 @@ REQUIRED_OFILES = regex.o cplus-dem.o cp-demangle.o md5.o \ make-relative-prefix.o \ make-temp-file.o \ objalloc.o obstack.o \ - partition.o @pexecute@ \ + partition.o physmem.o @pexecute@ \ safe-ctype.o sort.o spaces.o splay-tree.o strerror.o \ strsignal.o \ ternary.o \ diff --git a/libiberty/config.in b/libiberty/config.in index 738f075fff6..97c5702c2b1 100644 --- a/libiberty/config.in +++ b/libiberty/config.in @@ -1,4 +1,4 @@ -/* config.in. Generated automatically from configure.in by autoheader 2.13. */ +/* config.in. Generated automatically from configure.in by autoheader. */ /* Define to empty if the keyword does not work. */ #undef const @@ -222,6 +222,9 @@ /* Define if you have the <sys/param.h> header file. */ #undef HAVE_SYS_PARAM_H +/* Define if you have the <sys/pstat.h> header file. */ +#undef HAVE_SYS_PSTAT_H + /* Define if you have the <sys/resource.h> header file. */ #undef HAVE_SYS_RESOURCE_H diff --git a/libiberty/configure b/libiberty/configure index 320d8546a02..75e7564dbbf 100755 --- a/libiberty/configure +++ b/libiberty/configure @@ -1356,7 +1356,7 @@ else fi echo "$ac_t""$CPP" 1>&6 -for ac_hdr in sys/file.h sys/param.h limits.h stdlib.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h +for ac_hdr in sys/file.h sys/param.h limits.h stdlib.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 @@ -1738,7 +1738,7 @@ funcs="$funcs waitpid" vars="sys_errlist sys_nerr sys_siglist" checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday" -checkfuncs="$checkfuncs realpath canonicalize_file_name" +checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic" # These are neither executed nor required, but they help keep # autoheader happy without adding a bunch of text to acconfig.h. diff --git a/libiberty/configure.in b/libiberty/configure.in index d170a9f7e11..71e7a0928c9 100644 --- a/libiberty/configure.in +++ b/libiberty/configure.in @@ -142,7 +142,7 @@ AC_SUBST_FILE(host_makefile_frag) # It's OK to check for header files. Although the compiler may not be # able to link anything, it had better be able to at least compile # something. -AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h) +AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h) AC_HEADER_SYS_WAIT AC_HEADER_TIME @@ -207,7 +207,7 @@ funcs="$funcs waitpid" vars="sys_errlist sys_nerr sys_siglist" checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday" -checkfuncs="$checkfuncs realpath canonicalize_file_name" +checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic" # These are neither executed nor required, but they help keep # autoheader happy without adding a bunch of text to acconfig.h. 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; +} |