[retry] Add start_timer_fixed()
[people/dverkamp/gpxe.git] / src / include / gpxe / retry.h
1 #ifndef _GPXE_RETRY_H
2 #define _GPXE_RETRY_H
3
4 /** @file
5  *
6  * Retry timers
7  *
8  */
9
10 #include <gpxe/list.h>
11
12 /** A retry timer */
13 struct retry_timer {
14         /** List of active timers */
15         struct list_head list;
16         /** Timeout value (in ticks) */
17         unsigned long timeout;
18         /** Start time (in ticks)
19          *
20          * A start time of zero indicates a stopped timer.
21          */
22         unsigned long start;
23         /** Retry count */
24         unsigned int count;
25         /** Timer expired callback
26          *
27          * @v timer     Retry timer
28          * @v fail      Failure indicator
29          *
30          * The timer will already be stopped when this method is
31          * called.  The failure indicator will be True if the retry
32          * timeout has already exceeded @c MAX_TIMEOUT.
33          */
34         void ( * expired ) ( struct retry_timer *timer, int over );
35 };
36
37 extern void start_timer ( struct retry_timer *timer );
38 extern void start_timer_fixed ( struct retry_timer *timer,
39                                 unsigned long timeout );
40 extern void stop_timer ( struct retry_timer *timer );
41
42 /**
43  * Start timer with no delay
44  *
45  * @v timer             Retry timer
46  *
47  * This starts the timer running with a zero timeout value.
48  */
49 static inline void start_timer_nodelay ( struct retry_timer *timer ) {
50         start_timer_fixed ( timer, 0 );
51 }
52
53 /**
54  * Test to see if timer is currently running
55  *
56  * @v timer             Retry timer
57  * @ret running         Non-zero if timer is running
58  */
59 static inline __attribute__ (( always_inline )) unsigned long
60 timer_running ( struct retry_timer *timer ) {
61         return ( timer->start );
62 }
63
64 #endif /* _GPXE_RETRY_H */