[retry] Added configurable timeouts to retry timer
[people/balajirrao/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 /** Default timeout value */
13 #define DEFAULT_MIN_TIMEOUT ( TICKS_PER_SEC / 4 )
14
15 /** Limit after which the timeout will be deemed permanent */
16 #define DEFAULT_MAX_TIMEOUT ( 10 * TICKS_PER_SEC )
17
18 /** A retry timer */
19 struct retry_timer {
20         /** List of active timers */
21         struct list_head list;
22         /** Timeout value (in ticks) */
23         unsigned long timeout;
24         /** Minimum timeout value (in ticks)
25          *
26          * A value of zero means "use default timeout."
27          */
28         unsigned long min_timeout;
29         /** Maximum timeout value before failure (in ticks)
30          *
31          * A value of zero means "use default timeout."
32          */
33         unsigned long max_timeout;
34         /** Start time (in ticks)
35          *
36          * A start time of zero indicates a stopped timer.
37          */
38         unsigned long start;
39         /** Retry count */
40         unsigned int count;
41         /** Timer expired callback
42          *
43          * @v timer     Retry timer
44          * @v fail      Failure indicator
45          *
46          * The timer will already be stopped when this method is
47          * called.  The failure indicator will be True if the retry
48          * timeout has already exceeded @c MAX_TIMEOUT.
49          */
50         void ( * expired ) ( struct retry_timer *timer, int over );
51 };
52
53 extern void start_timer ( struct retry_timer *timer );
54 extern void start_timer_fixed ( struct retry_timer *timer,
55                                 unsigned long timeout );
56 extern void stop_timer ( struct retry_timer *timer );
57
58 /**
59  * Start timer with no delay
60  *
61  * @v timer             Retry timer
62  *
63  * This starts the timer running with a zero timeout value.
64  */
65 static inline void start_timer_nodelay ( struct retry_timer *timer ) {
66         start_timer_fixed ( timer, 0 );
67 }
68
69 /**
70  * Test to see if timer is currently running
71  *
72  * @v timer             Retry timer
73  * @ret running         Non-zero if timer is running
74  */
75 static inline __attribute__ (( always_inline )) unsigned long
76 timer_running ( struct retry_timer *timer ) {
77         return ( timer->start );
78 }
79
80 #endif /* _GPXE_RETRY_H */