diff options
author | Junio C Hamano <gitster@pobox.com> | 2014-02-05 14:01:23 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-02-05 14:01:23 -0800 |
commit | 28856247e226c9bf84c258797ddb4a233b8acd7b (patch) | |
tree | fcd8a7bf5ac92b33c3ad548dff48bf86bb68ed67 | |
parent | Merge branch 'jl/commit-v-strip-marker' into maint (diff) | |
parent | get_max_fd_limit(): fall back to OPEN_MAX upon getrlimit/sysconf failure (diff) | |
download | tgif-28856247e226c9bf84c258797ddb4a233b8acd7b.tar.xz |
Merge branch 'jh/rlimit-nofile-fallback' into maint
When we figure out how many file descriptors to allocate for
keeping packfiles open, a system with non-working getrlimit() could
cause us to die(), but because we make this call only to get a
rough estimate of how many is available and we do not even attempt
to use up all file descriptors available ourselves, it is nicer to
fall back to a reasonable low value rather than dying.
* jh/rlimit-nofile-fallback:
get_max_fd_limit(): fall back to OPEN_MAX upon getrlimit/sysconf failure
-rw-r--r-- | sha1_file.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/sha1_file.c b/sha1_file.c index 760dd60031..06c809aeeb 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -807,15 +807,38 @@ void free_pack_by_name(const char *pack_name) static unsigned int get_max_fd_limit(void) { #ifdef RLIMIT_NOFILE - struct rlimit lim; + { + struct rlimit lim; - if (getrlimit(RLIMIT_NOFILE, &lim)) - die_errno("cannot get RLIMIT_NOFILE"); + if (!getrlimit(RLIMIT_NOFILE, &lim)) + return lim.rlim_cur; + } +#endif + +#ifdef _SC_OPEN_MAX + { + long open_max = sysconf(_SC_OPEN_MAX); + if (0 < open_max) + return open_max; + /* + * Otherwise, we got -1 for one of the two + * reasons: + * + * (1) sysconf() did not understand _SC_OPEN_MAX + * and signaled an error with -1; or + * (2) sysconf() said there is no limit. + * + * We _could_ clear errno before calling sysconf() to + * tell these two cases apart and return a huge number + * in the latter case to let the caller cap it to a + * value that is not so selfish, but letting the + * fallback OPEN_MAX codepath take care of these cases + * is a lot simpler. + */ + } +#endif - return lim.rlim_cur; -#elif defined(_SC_OPEN_MAX) - return sysconf(_SC_OPEN_MAX); -#elif defined(OPEN_MAX) +#ifdef OPEN_MAX return OPEN_MAX; #else return 1; /* see the caller ;-) */ |