From e7cb622ee5cf2cc1c019374c3911d9c70083701d Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 27 Jul 2015 16:31:35 -0400 Subject: Infer the right value for nopenfd, and recover from EMFILE. --- bftw.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'bftw.c') diff --git a/bftw.c b/bftw.c index 31e6fe2..75a208c 100644 --- a/bftw.c +++ b/bftw.c @@ -291,7 +291,19 @@ static DIR *dircache_entry_open(dircache *cache, dircache_entry *entry, const ch fd = dirfd(base->dir); } - DIR *dir = opendirat(fd, path + nameoff); + const char *relpath = path + nameoff; + DIR *dir = opendirat(fd, relpath); + + if (!dir + && errno == EMFILE + && cache->lru_tail + && cache->lru_tail != base) { + // Too many open files, shrink the LRU cache + dircache_entry_close(cache, cache->lru_tail); + --cache->lru_remaining; + dir = opendirat(fd, relpath); + } + if (dir) { entry->dir = dir; dircache_lru_add(cache, entry); -- cgit v1.2.3