io_dtor( void * vio )
{
tr_peerIo * io = vio;
+
assert( tr_isPeerIo( io ) );
+ assert( tr_amInEventThread( io->session ) );
+ assert( io->session->events != NULL );
dbgmsg( io, "in tr_peerIo destructor" );
event_del( &io->event_read );
static void
event_enable( tr_peerIo * io, short event )
{
+ assert( tr_amInEventThread( io->session ) );
+ assert( io->session->events != NULL );
assert( event_initialized( &io->event_read ) );
assert( event_initialized( &io->event_write ) );
static void
event_disable( struct tr_peerIo * io, short event )
{
+ assert( tr_amInEventThread( io->session ) );
+ assert( io->session->events != NULL );
assert( event_initialized( &io->event_read ) );
assert( event_initialized( &io->event_write ) );
assert( tr_isPeerIo( io ) );
assert( tr_isDirection( dir ) );
+ assert( tr_amInEventThread( io->session ) );
+ assert( io->session->events != NULL );
if( isEnabled )
event_enable( io, event );
tr_setConfigDir( session, configDir );
tr_netInit( ); /* must go before tr_eventInit */
-
tr_eventInit( session );
- while( !session->events )
- tr_wait( 50 );
+ assert( session->events != NULL );
session->peerMgr = tr_peerMgrNew( session );
libeventThreadFunc( void * veh )
{
tr_event_handle * eh = veh;
-
tr_dbg( "Starting libevent thread" );
#ifndef WIN32
signal( SIGPIPE, SIG_IGN );
#endif
+ eh->base = event_init( );
eh->session->events = eh;
/* listen to the pipe's read fd */
- event_set( &eh->pipeEvent, eh->fds[0], EV_READ | EV_PERSIST,
- readFromPipe,
- veh );
+ event_set( &eh->pipeEvent, eh->fds[0], EV_READ | EV_PERSIST, readFromPipe, veh );
event_add( &eh->pipeEvent, NULL );
event_set_log_callback( logFunc );
+
+ /* loop until all the events are done */
event_dispatch( );
+ /* shut down the thread */
tr_lockFree( eh->lock );
event_base_free( eh->base );
eh->session->events = NULL;
{
tr_event_handle * eh;
+ session->events = NULL;
+
eh = tr_new0( tr_event_handle, 1 );
eh->lock = tr_lockNew( );
pipe( eh->fds );
eh->session = session;
- eh->base = event_init( );
eh->thread = tr_threadNew( libeventThreadFunc, eh );
+
+ /* wait until the libevent thread is running */
+ while( session->events == NULL )
+ tr_wait( 100 );
}
void