This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Patch: *bsd & darwin support in libiberty/physmem.c
- From: Richard Earnshaw <rearnsha at arm dot com>
- To: Geoff Keating <geoffk at geoffk dot org>
- Cc: gcc-patches at gcc dot gnu dot org, "Kaveh R. Ghazi" <ghazi at caip dot rutgers dot edu>, Richard dot Earnshaw at arm dot com
- Date: Sat, 22 Feb 2003 12:52:13 +0000
- Subject: Re: Patch: *bsd & darwin support in libiberty/physmem.c
- Organization: ARM Ltd.
- Reply-to: Richard dot Earnshaw at arm dot com
>
> geoffk at geoffk dot org said:
> > Aargh! That version works, but right after I sent it I saw I'd done
> > the error-checking wrong.
>
> > This is better.
>
> Nearly, but it still contains a GCCism. IIRC you can't initialize an
> automatic array during a declartion in ISO C90.
>
> Here's a further slight revision which works OK on NetBSD/arm. I've also
> included a missing Makefile dependency on config.h and libiberty.h
>
> R.
>
To echo Geoff's cry of anguish... Aargggggghhhhhh!
You get a better measure of the amount of available memory if you ask for
the available memory rather than the page size...
R.
Index: Makefile.in
===================================================================
RCS file: /cvs/gcc/gcc/libiberty/Makefile.in,v
retrieving revision 1.87
diff -p -r1.87 Makefile.in
*** Makefile.in 21 Feb 2003 00:27:04 -0000 1.87
--- Makefile.in 22 Feb 2003 12:48:30 -0000
*************** pex-msdos.o: config.h pex-common.h $(INC
*** 466,471 ****
--- 466,472 ----
pex-os2.o: config.h pex-common.h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h
pex-unix.o: config.h pex-common.h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h
pex-win32.o: config.h pex-common.h $(INCDIR)/ansidecl.h $(INCDIR)/libiberty.h
+ physmem.o: config.h $(INCDIR)/libiberty.h
putenv.o: config.h $(INCDIR)/ansidecl.h
random.o: $(INCDIR)/ansidecl.h
regex.o: config.h $(INCDIR)/xregex.h $(INCDIR)/xregex2.h
Index: config.in
===================================================================
RCS file: /cvs/gcc/gcc/libiberty/config.in,v
retrieving revision 1.25
diff -p -r1.25 config.in
*** config.in 21 Feb 2003 20:33:49 -0000 1.25
--- config.in 22 Feb 2003 12:48:30 -0000
***************
*** 183,188 ****
--- 183,191 ----
/* Define if you have the sysconf function. */
#undef HAVE_SYSCONF
+ /* Define if you have the sysctl function. */
+ #undef HAVE_SYSCTL
+
/* Define if you have the sysmp function. */
#undef HAVE_SYSMP
***************
*** 248,253 ****
--- 251,259 ----
/* Define if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
+
+ /* Define if you have the <sys/sysctl.h> header file. */
+ #undef HAVE_SYS_SYSCTL_H
/* Define if you have the <sys/sysinfo.h> header file. */
#undef HAVE_SYS_SYSINFO_H
Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/libiberty/configure.in,v
retrieving revision 1.61
diff -p -r1.61 configure.in
*** configure.in 21 Feb 2003 20:33:50 -0000 1.61
--- configure.in 22 Feb 2003 12:48:30 -0000
*************** AC_SUBST_FILE(host_makefile_frag)
*** 142,148 ****
# 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 sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h)
AC_HEADER_SYS_WAIT
AC_HEADER_TIME
--- 142,148 ----
# 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 sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h)
AC_HEADER_SYS_WAIT
AC_HEADER_TIME
*************** vars="sys_errlist sys_nerr sys_siglist"
*** 208,214 ****
checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday"
checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic sysmp"
! checkfuncs="$checkfuncs getsysinfo table"
# These are neither executed nor required, but they help keep
# autoheader happy without adding a bunch of text to acconfig.h.
--- 208,214 ----
checkfuncs="getrusage on_exit psignal strerror strsignal sysconf times sbrk gettimeofday"
checkfuncs="$checkfuncs realpath canonicalize_file_name pstat_getstatic pstat_getdynamic sysmp"
! checkfuncs="$checkfuncs getsysinfo table sysctl"
# These are neither executed nor required, but they help keep
# autoheader happy without adding a bunch of text to acconfig.h.
*************** if test "x" = "y"; then
*** 220,226 ****
AC_CHECK_FUNCS(strtod strtol strtoul tmpnam vasprintf vfprintf vprintf)
AC_CHECK_FUNCS(vsprintf waitpid getrusage on_exit psignal strerror strsignal)
AC_CHECK_FUNCS(sysconf times sbrk gettimeofday ffs)
! AC_CHECK_FUNCS(pstat_getstatic pstat_getdynamic sysmp getsysinfo table)
AC_CHECK_FUNCS(realpath canonicalize_file_name)
AC_DEFINE(HAVE_SYS_ERRLIST, 1, [Define if you have the sys_errlist variable.])
AC_DEFINE(HAVE_SYS_NERR, 1, [Define if you have the sys_nerr variable.])
--- 220,226 ----
AC_CHECK_FUNCS(strtod strtol strtoul tmpnam vasprintf vfprintf vprintf)
AC_CHECK_FUNCS(vsprintf waitpid getrusage on_exit psignal strerror strsignal)
AC_CHECK_FUNCS(sysconf times sbrk gettimeofday ffs)
! AC_CHECK_FUNCS(pstat_getstatic pstat_getdynamic sysmp getsysinfo table sysctl)
AC_CHECK_FUNCS(realpath canonicalize_file_name)
AC_DEFINE(HAVE_SYS_ERRLIST, 1, [Define if you have the sys_errlist variable.])
AC_DEFINE(HAVE_SYS_NERR, 1, [Define if you have the sys_nerr variable.])
Index: physmem.c
===================================================================
RCS file: /cvs/gcc/gcc/libiberty/physmem.c,v
retrieving revision 1.5
diff -p -r1.5 physmem.c
*** physmem.c 21 Feb 2003 20:33:50 -0000 1.5
--- physmem.c 22 Feb 2003 12:48:30 -0000
***************
*** 42,47 ****
--- 42,57 ----
# include <sys/table.h>
#endif
+ #include <sys/types.h>
+
+ #if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif
+
+ #if HAVE_SYS_SYSCTL_H
+ #include <sys/sysctl.h>
+ #endif
+
#include "libiberty.h"
/* Return the total amount of physical memory. */
*************** physmem_total ()
*** 98,103 ****
--- 108,125 ----
}
#endif
+ #if HAVE_SYSCTL && defined HW_PHYSMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int physmem;
+ size_t len = sizeof(physmem);
+ static int mib[2] = {CTL_HW, HW_PHYSMEM};
+
+ if (sysctl(mib, ARRAY_SIZE(mib), &physmem, &len, NULL, 0) == 0
+ && len == sizeof (physmem))
+ return (double)physmem;
+ }
+ #endif
+
/* Return 0 if we can't determine the value. */
return 0;
}
*************** physmem_available ()
*** 155,160 ****
--- 177,194 ----
if (0 <= pages && 0 <= pagesize)
return pages * pagesize;
}
+ }
+ #endif
+
+ #if HAVE_SYSCTL && defined HW_USERMEM
+ { /* This works on *bsd and darwin. */
+ unsigned int usermem;
+ size_t len = sizeof(usermem);
+ static int mib[2] = {CTL_HW, HW_USERMEM};
+
+ if (sysctl(mib, ARRAY_SIZE(mib), &usermem, &len, NULL, 0) == 0
+ && len == sizeof (usermem))
+ return (double)usermem;
}
#endif