static void restart_timer( tr_web * g ) { struct timeval interval; stop_timer( g ); dbgmsg( "adding a timeout for %ld seconds from now", g->timer_ms/1000L ); tr_timevalMsec( g->timer_ms, &interval ); evtimer_add( &g->timer_event, &interval ); }
tr_timer* tr_timerNew( tr_session * session, timer_func func, void * user_data, uint64_t interval_milliseconds ) { tr_timer * timer; assert( tr_amInEventThread( session ) ); timer = tr_new0( tr_timer, 1 ); timer->func = func; timer->user_data = user_data; timer->eh = session->events; tr_timevalMsec( interval_milliseconds, &timer->tv ); evtimer_set( &timer->event, timerCallback, timer ); evtimer_add( &timer->event, &timer->tv ); return timer; }
tr_timer* tr_timerNew( struct tr_handle * handle, timer_func func, void * user_data, uint64_t interval_milliseconds ) { tr_timer * timer; assert( handle ); assert( handle->events ); timer = tr_new0( tr_timer, 1 ); tr_timevalMsec( interval_milliseconds, &timer->tv ); timer->func = func; timer->user_data = user_data; timer->eh = handle->events; evtimer_set( &timer->event, timerCallback, timer ); if( tr_amInThread( handle->events->thread ) ) { evtimer_add( &timer->event, &timer->tv ); } else { const char ch = 't'; int fd = handle->events->fds[1]; tr_lock * lock = handle->events->lock; tr_lockLock( lock ); pipewrite( fd, &ch, 1 ); pipewrite( fd, &timer, sizeof( timer ) ); tr_lockUnlock( lock ); } return timer; }