[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

@@ -49,6 +49,12 @@ struct retry_timer {
* timeout has already exceeded @c MAX_TIMEOUT.
*/
void ( * expired ) ( struct retry_timer *timer, int over );
/** Reference counter
*
* If this interface is not part of a reference-counted
* object, this field may be NULL.
*/
struct refcnt *refcnt;
};
/**
@@ -56,11 +62,14 @@ struct retry_timer {
*
* @v timer Retry timer
* @v expired Timer expired callback
* @v refcnt Reference counter, or NULL
*/
static inline __attribute__ (( always_inline )) void
timer_init ( struct retry_timer *timer,
void ( * expired ) ( struct retry_timer *timer, int over ) ) {
void ( * expired ) ( struct retry_timer *timer, int over ),
struct refcnt *refcnt ) {
timer->expired = expired;
timer->refcnt = refcnt;
}
extern void start_timer ( struct retry_timer *timer );