diff options
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/cache.c | 38 | ||||
-rw-r--r-- | bfd/config.in | 6 | ||||
-rwxr-xr-x | bfd/configure | 12 | ||||
-rw-r--r-- | bfd/configure.in | 4 | ||||
-rw-r--r-- | bfd/sysdep.h | 4 |
6 files changed, 65 insertions, 13 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d01e687..a29227e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2013-05-26 Mark Wielaard <mjw@redhat.com> + + * cache.c (BFD_CACHE_MAX_OPEN): Remove define. + (max_open_files): New static int initialized to zero. + (bfd_cache_max_open): New static function to set and return + max_open_files. + (bfd_cache_init): Use bfd_cache_max_open. + (bfd_open_file): Likewise. + * configure.in (AC_CHECK_HEADERS): Add sys/resource.h. + (AC_CHECK_FUNCS): Add getrlimit. + * configure: Regenerated. + * config.in: Likewise. + * sysdep.h: Check and include sys/resource.h for getrlimit. + 2013-05-23 Alan Modra <amodra@gmail.com> * format.c (bfd_check_format_matches): Don't match a target in diff --git a/bfd/cache.c b/bfd/cache.c index 5226816..4d46936 100644 --- a/bfd/cache.c +++ b/bfd/cache.c @@ -31,7 +31,7 @@ SECTION regard to the underlying operating system's file descriptor limit (often as low as 20 open files). The module in <<cache.c>> maintains a least recently used list of - <<BFD_CACHE_MAX_OPEN>> files, and exports the name + <<bfd_cache_max_open>> files, and exports the name <<bfd_cache_lookup>>, which runs around and makes sure that the required BFD is open. If not, then it chooses a file to close, closes it and opens the one wanted, returning its file @@ -67,9 +67,35 @@ enum cache_flag { }; /* The maximum number of files which the cache will keep open at - one time. */ + one time. When needed call bfd_cache_max_open to initialize. */ -#define BFD_CACHE_MAX_OPEN 10 +static int max_open_files = 0; + +/* Set max_open_files, if not already set, to 12.5% of the allowed open + file descriptors, but at least 10, and return the value. */ +static int +bfd_cache_max_open (void) +{ + if (max_open_files == 0) + { + int max; +#ifdef HAVE_GETRLIMIT + struct rlimit rlim; + if (getrlimit (RLIMIT_NOFILE, &rlim) == 0 + && rlim.rlim_cur != RLIM_INFINITY) + max = rlim.rlim_cur / 8; + else +#endif /* HAVE_GETRLIMIT */ +#ifdef _SC_OPEN_MAX + max = sysconf (_SC_OPEN_MAX) / 8; +#else + max = 10; +#endif /* _SC_OPEN_MAX */ + max_open_files = max < 10 ? 10 : max; + } + + return max_open_files; +} /* The number of BFD files we have open. */ @@ -187,7 +213,7 @@ close_one (void) /* Called when the macro <<bfd_cache_lookup>> fails to find a quick answer. Find a file descriptor for @var{abfd}. If necessary, it open it. If there are already more than - <<BFD_CACHE_MAX_OPEN>> files open, it tries to close one first, to + <<bfd_cache_max_open>> files open, it tries to close one first, to avoid running out of file descriptors. It will return NULL if it is unable to (re)open the @var{abfd}. */ @@ -466,7 +492,7 @@ bfd_boolean bfd_cache_init (bfd *abfd) { BFD_ASSERT (abfd->iostream != NULL); - if (open_files >= BFD_CACHE_MAX_OPEN) + if (open_files >= bfd_cache_max_open ()) { if (! close_one ()) return FALSE; @@ -553,7 +579,7 @@ bfd_open_file (bfd *abfd) { abfd->cacheable = TRUE; /* Allow it to be closed later. */ - if (open_files >= BFD_CACHE_MAX_OPEN) + if (open_files >= bfd_cache_max_open ()) { if (! close_one ()) return NULL; diff --git a/bfd/config.in b/bfd/config.in index 2fc4897..65fb044 100644 --- a/bfd/config.in +++ b/bfd/config.in @@ -112,6 +112,9 @@ /* Define to 1 if you have the `getpagesize' function. */ #undef HAVE_GETPAGESIZE +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID @@ -234,6 +237,9 @@ /* Define to 1 if you have the <sys/procfs.h> header file. */ #undef HAVE_SYS_PROCFS_H +/* Define to 1 if you have the <sys/resource.h> header file. */ +#undef HAVE_SYS_RESOURCE_H + /* Define to 1 if you have the <sys/stat.h> header file. */ #undef HAVE_SYS_STAT_H diff --git a/bfd/configure b/bfd/configure index 5fc08e4..090f981 100755 --- a/bfd/configure +++ b/bfd/configure @@ -12908,7 +12908,7 @@ fi done -for ac_header in fcntl.h sys/file.h sys/time.h sys/stat.h +for ac_header in fcntl.h sys/file.h sys/time.h sys/stat.h sys/resource.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" @@ -13583,12 +13583,14 @@ _ACEOF fi done -for ac_func in strtoull +for ac_func in strtoull getrlimit do : - ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" -if test "x$ac_cv_func_strtoull" = x""yes; then : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF -#define HAVE_STRTOULL 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi diff --git a/bfd/configure.in b/bfd/configure.in index befcf27..ff14270 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -211,7 +211,7 @@ AC_SUBST(BFD_HOSTPTR_T) BFD_CC_FOR_BUILD AC_CHECK_HEADERS(alloca.h stddef.h string.h strings.h stdlib.h time.h unistd.h) -AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h sys/stat.h) +AC_CHECK_HEADERS(fcntl.h sys/file.h sys/time.h sys/stat.h sys/resource.h) GCC_HEADER_STDINT(bfd_stdint.h) AC_HEADER_TIME AC_HEADER_DIRENT @@ -220,7 +220,7 @@ AC_CHECK_HEADERS(windows.h dlfcn.h) ACX_HEADER_STRING AC_CHECK_FUNCS(fcntl getpagesize setitimer sysconf fdopen getuid getgid fileno) -AC_CHECK_FUNCS(strtoull) +AC_CHECK_FUNCS(strtoull getrlimit) AC_CHECK_DECLS(basename) AC_CHECK_DECLS(ftello) diff --git a/bfd/sysdep.h b/bfd/sysdep.h index b4fed10..d560e76 100644 --- a/bfd/sysdep.h +++ b/bfd/sysdep.h @@ -79,6 +79,10 @@ extern char *strrchr (); #include <unistd.h> #endif +#ifdef HAVE_SYS_RESOURCE_H +#include <sys/resource.h> +#endif /* HAVE_SYS_RESOURCE_H */ + #ifdef USE_BINARY_FOPEN #include "fopen-bin.h" #else |