decide at runtime, rather than compile time, whether to use curl_multi_action

This commit is contained in:
Charles Kerr 2009-09-08 05:18:46 +00:00
parent 600e2d26ec
commit bd41421591
1 changed files with 35 additions and 19 deletions

View File

@ -27,11 +27,24 @@
#include "version.h" #include "version.h"
#include "web.h" #include "web.h"
/* Use curl_multi_socket_action() instead of curl_multi_perform() static tr_bool
if libcurl >= 7.18.2. See http://trac.transmissionbt.com/ticket/1844 */ useCurlMultiSocketAction( void )
#if LIBCURL_VERSION_NUM >= 0x071202 {
#define USE_CURL_MULTI_SOCKET_ACTION static tr_bool tested = FALSE;
#endif static tr_bool useMultiSocketAction;
if( !tested )
{
curl_version_info_data * data = curl_version_info( CURLVERSION_NOW );
tr_inf( "Using libcurl %s", data->version );
/* Use curl_multi_socket_action() instead of curl_multi_perform()
* if libcurl >= 7.18.2. See http://trac.transmissionbt.com/ticket/1844 */
useMultiSocketAction = data->version_num >= 0x071202;
tested = TRUE;
}
return useMultiSocketAction;
}
enum enum
@ -385,20 +398,23 @@ tr_multi_perform( tr_web * g, int fd )
g->prev_running, g->still_running ); g->prev_running, g->still_running );
/* invoke libcurl's processing */ /* invoke libcurl's processing */
#ifdef USE_CURL_MULTI_SOCKET_ACTION if( useCurlMultiSocketAction( ) )
do { {
dbgmsg( "calling curl_multi_socket_action..." ); do {
mcode = curl_multi_socket_action( g->multi, fd, 0, &g->still_running ); dbgmsg( "calling curl_multi_socket_action..." );
fd = CURL_SOCKET_TIMEOUT; mcode = curl_multi_socket_action( g->multi, fd, 0, &g->still_running );
dbgmsg( "done calling curl_multi_socket_action..." ); fd = CURL_SOCKET_TIMEOUT;
} while( mcode == CURLM_CALL_MULTI_SOCKET ); dbgmsg( "done calling curl_multi_socket_action..." );
#else } while( mcode == CURLM_CALL_MULTI_SOCKET );
do { }
dbgmsg( "calling curl_multi_perform..." ); else
mcode = curl_multi_perform( g->multi, &g->still_running ); {
dbgmsg( "done calling curl_multi_perform..." ); do {
} while( mcode == CURLM_CALL_MULTI_PERFORM ); dbgmsg( "calling curl_multi_perform..." );
#endif mcode = curl_multi_perform( g->multi, &g->still_running );
dbgmsg( "done calling curl_multi_perform..." );
} while( mcode == CURLM_CALL_MULTI_PERFORM );
}
tr_assert( mcode == CURLM_OK, "curl_multi_perform() failed: %d (%s)", mcode, curl_multi_strerror( mcode ) ); tr_assert( mcode == CURLM_OK, "curl_multi_perform() failed: %d (%s)", mcode, curl_multi_strerror( mcode ) );
if( mcode != CURLM_OK ) if( mcode != CURLM_OK )
tr_err( "%s", curl_multi_strerror( mcode ) ); tr_err( "%s", curl_multi_strerror( mcode ) );