mirror of
https://github.com/ipxe/ipxe
synced 2025-12-23 05:21:49 +03:00
[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:
@@ -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 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user