From 2c69c425544a24fe1b0b73353eac04d12cf89d41 Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Mon, 11 Jul 2011 20:48:06 +0000 Subject: [PATCH] (trunk libT) restore setrlimit(), although in an non-configurable mode. --- libtransmission/fdlimit.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/libtransmission/fdlimit.c b/libtransmission/fdlimit.c index c52b7533e..35397310e 100644 --- a/libtransmission/fdlimit.c +++ b/libtransmission/fdlimit.c @@ -36,10 +36,8 @@ #include #include -#ifdef HAVE_GETRLIMIT - #include /* getrlimit */ - #include /* getrlimit */ -#endif +#include /* getrlimit */ +#include /* getrlimit */ #include /* O_LARGEFILE posix_fadvise */ #include /* lseek(), write(), ftruncate(), pread(), pwrite(), etc */ @@ -524,10 +522,28 @@ ensureSessionFdInfoExists( tr_session * session ) if( session->fdInfo == NULL ) { - const int TR_MAX_OPEN_FILES = 32; - struct tr_fdInfo * i = tr_new0( struct tr_fdInfo, 1 ); - fileset_construct( &i->fileset, TR_MAX_OPEN_FILES ); + struct rlimit limit; + struct tr_fdInfo * i; + const int FILE_CACHE_SIZE = 32; + + /* Create the local file cache */ + i = tr_new0( struct tr_fdInfo, 1 ); + fileset_construct( &i->fileset, FILE_CACHE_SIZE ); session->fdInfo = i; + + /* set the open-file limit to the largest safe size wrt FD_SETSIZE */ + if( !getrlimit( RLIMIT_NOFILE, &limit ) ) + { + const int old_limit = (int) limit.rlim_cur; + const int new_limit = MIN( limit.rlim_max, FD_SETSIZE ); + if( new_limit != old_limit ) + { + limit.rlim_cur = new_limit; + setrlimit( RLIMIT_NOFILE, &limit ); + getrlimit( RLIMIT_NOFILE, &limit ); + tr_inf( "Changed open file limit from %d to %d", old_limit, (int)limit.rlim_cur ); + } + } } }