[retry] Hold reference while timer is running and during expiry callback

Guarantee that a retry timer cannot go out of scope while the timer is
running, and provide a guarantee to the expiry callback that the timer
will remain in scope during the entire callback (similar to the
guarantee provided to interface methods).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2010-09-02 03:34:04 +01:00
parent 25447294d5
commit 28934eef81
10 changed files with 31 additions and 14 deletions

View File

@@ -57,8 +57,10 @@ static LIST_HEAD ( timers );
* be stopped and the timer's callback function will be called.
*/
void start_timer ( struct retry_timer *timer ) {
if ( ! timer->running )
if ( ! timer->running ) {
list_add ( &timer->list, &timers );
ref_get ( timer->refcnt );
}
timer->start = currticks();
timer->running = 1;
@@ -136,6 +138,8 @@ void stop_timer ( struct retry_timer *timer ) {
timer, timer->timeout );
}
}
ref_put ( timer->refcnt );
}
/**
@@ -164,7 +168,9 @@ static void timer_expired ( struct retry_timer *timer ) {
timer, timer->timeout );
/* Call expiry callback */
timer->expired ( timer, fail );
timer->expired ( timer, fail );
ref_put ( timer->refcnt );
}
/**