mirror of
https://github.com/ipxe/ipxe
synced 2025-12-23 13:30:57 +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:
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user