#include <curl/curl.h>
#include "transmission.h"
+#include "list.h"
#include "trevent.h"
#include "utils.h"
#include "web.h"
struct tr_web
{
- unsigned int dying : 1;
- unsigned int running : 1;
int remain;
CURLM * cm;
tr_session * session;
+ tr_list * socket_events;
struct event timer;
};
}
}
-static void
-webDestroy( tr_web * web )
-{
- dbgmsg( "deleting web timer" );
- assert( !web->running );
- evtimer_del( &web->timer );
- curl_multi_cleanup( web->cm );
- tr_free( web );
-}
-
/* libevent says that sock is ready to be processed, so wake up libcurl */
static void
event_callback( int sock, short action, void * vweb )
event_del( ev );
else {
ev = tr_new0( struct event, 1 );
+ tr_list_prepend( &web->socket_events, ev );
curl_multi_assign( web->cm, sock, ev );
}
case CURL_POLL_IN: events |= EV_READ; break;
case CURL_POLL_OUT: events |= EV_WRITE; break;
case CURL_POLL_INOUT: events |= EV_READ|EV_WRITE; break;
- case CURL_POLL_REMOVE: tr_free( ev ); /* fallthrough */
+ case CURL_POLL_REMOVE: tr_list_remove_data( &web->socket_events, ev );
+ tr_free( ev );
+ /* fallthrough */
case CURL_POLL_NONE: return 0;
default: tr_err( "Unknown socket action %d", action ); return -1;
}
{
tr_web * web = vweb;
struct timeval timeout = tr_timevalMsec( timeout_ms );
- evtimer_add( &web->timer, &timeout );
+ timeout_add( &web->timer, &timeout );
}
tr_web*
web->cm = curl_multi_init( );
web->session = session;
- evtimer_set( &web->timer, timeout_callback, web );
+ timeout_set( &web->timer, timeout_callback, web );
curl_multi_setopt( web->cm, CURLMOPT_SOCKETDATA, web );
curl_multi_setopt( web->cm, CURLMOPT_SOCKETFUNCTION, socket_callback );
curl_multi_setopt( web->cm, CURLMOPT_TIMERDATA, web );
return web;
}
+static void
+event_del_and_free( void * e )
+{
+ event_del( e );
+ tr_free( e );
+}
+
void
tr_webClose( tr_web ** web_in )
{
tr_web * web = *web_in;
*web_in = NULL;
- if( !web->running )
- webDestroy( web );
- else
- web->dying = 1;
+ timeout_del( &web->timer );
+ tr_list_free( &web->socket_events, event_del_and_free );
+ curl_multi_cleanup( web->cm );
+ tr_free( web );
}
/***