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>