Annotation of embedaddon/bird2/lib/timer.h, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD -- Timers
3: *
4: * (c) 2013--2017 Ondrej Zajicek <santiago@crfreenet.org>
5: * (c) 2013--2017 CZ.NIC z.s.p.o.
6: *
7: * Can be freely distributed and used under the terms of the GNU GPL.
8: */
9:
10: #ifndef _BIRD_TIMER_H_
11: #define _BIRD_TIMER_H_
12:
13: #include "nest/bird.h"
14: #include "lib/buffer.h"
15: #include "lib/resource.h"
16:
17:
18: typedef struct timer
19: {
20: resource r;
21: void (*hook)(struct timer *);
22: void *data;
23:
24: btime expires; /* 0=inactive */
25: uint randomize; /* Amount of randomization */
26: uint recurrent; /* Timer recurrence */
27:
28: int index;
29: } timer;
30:
31: struct timeloop
32: {
33: BUFFER_(timer *) timers;
34: btime last_time;
35: btime real_time;
36: };
37:
38: static inline uint timers_count(struct timeloop *loop)
39: { return loop->timers.used - 1; }
40:
41: static inline timer *timers_first(struct timeloop *loop)
42: { return (loop->timers.used > 1) ? loop->timers.data[1] : NULL; }
43:
44: extern struct timeloop main_timeloop;
45:
46: btime current_time(void);
47: btime current_real_time(void);
48:
49: //#define now (current_time() TO_S)
50: //#define now_real (current_real_time() TO_S)
51: extern btime boot_time;
52:
53: timer *tm_new(pool *p);
54: void tm_set(timer *t, btime when);
55: void tm_start(timer *t, btime after);
56: void tm_stop(timer *t);
57:
58: static inline int
59: tm_active(timer *t)
60: {
61: return t->expires != 0;
62: }
63:
64: static inline btime
65: tm_remains(timer *t)
66: {
67: btime now_ = current_time();
68: return (t->expires > now_) ? (t->expires - now_) : 0;
69: }
70:
71: static inline timer *
72: tm_new_init(pool *p, void (*hook)(struct timer *), void *data, uint rec, uint rand)
73: {
74: timer *t = tm_new(p);
75: t->hook = hook;
76: t->data = data;
77: t->recurrent = rec;
78: t->randomize = rand;
79: return t;
80: }
81:
82: static inline void
83: tm_set_max(timer *t, btime when)
84: {
85: if (when > t->expires)
86: tm_set(t, when);
87: }
88:
89: static inline void
90: tm_start_max(timer *t, btime after)
91: {
92: btime rem = tm_remains(t);
93: tm_start(t, MAX_(rem, after));
94: }
95:
96: /* In sysdep code */
97: void times_init(struct timeloop *loop);
98: void times_update(struct timeloop *loop);
99: void times_update_real_time(struct timeloop *loop);
100:
101: /* For I/O loop */
102: void timers_init(struct timeloop *loop, pool *p);
103: void timers_fire(struct timeloop *loop);
104:
105: void timer_init(void);
106:
107:
108: struct timeformat {
109: char *fmt1, *fmt2;
110: btime limit;
111: };
112:
113: #define TM_ISO_SHORT_S (struct timeformat){"%T", "%F", (s64) (20*3600) S_}
114: #define TM_ISO_SHORT_MS (struct timeformat){"%T.%3f", "%F", (s64) (20*3600) S_}
115: #define TM_ISO_SHORT_US (struct timeformat){"%T.%6f", "%F", (s64) (20*3600) S_}
116:
117: #define TM_ISO_LONG_S (struct timeformat){"%F %T", NULL, 0}
118: #define TM_ISO_LONG_MS (struct timeformat){"%F %T.%3f", NULL, 0}
119: #define TM_ISO_LONG_US (struct timeformat){"%F %T.%6f", NULL, 0}
120:
121: #define TM_DATETIME_BUFFER_SIZE 32 /* Buffer size required by tm_format_time() */
122:
123: btime tm_parse_time(char *x);
124: void tm_format_time(char *x, struct timeformat *fmt, btime t);
125: int tm_format_real_time(char *x, size_t max, const char *fmt, btime t);
126:
127: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>