Annotation of embedaddon/bird2/lib/timer.h, revision 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>