summaryrefslogtreecommitdiff
path: root/proto/bfd/io.h
blob: 3f166a47f375eec5f124d8ca2d0019b2d6241b96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 *	BIRD -- I/O and event loop
 *
 *	Can be freely distributed and used under the terms of the GNU GPL.
 */

#ifndef _BIRD_BFD_IO_H_
#define _BIRD_BFD_IO_H_

#include "nest/bird.h"
#include "lib/lists.h"
#include "lib/resource.h"
#include "lib/event.h"
#include "lib/socket.h"
// #include "lib/timer.h"


typedef struct timer2
{
  resource r;
  void (*hook)(struct timer2 *);
  void *data;

  btime expires;			/* 0=inactive */
  uint randomize;			/* Amount of randomization */
  uint recurrent;			/* Timer recurrence */

  int index;
} timer2;


btime current_time(void);

void ev2_schedule(event *e);


timer2 *tm2_new(pool *p);
void tm2_set(timer2 *t, btime when);
void tm2_start(timer2 *t, btime after);
void tm2_stop(timer2 *t);

static inline int
tm2_active(timer2 *t)
{
  return t->expires != 0;
}

static inline btime 
tm2_remains(timer2 *t)
{
  btime now = current_time();
  return (t->expires > now) ? (t->expires - now) : 0;
}

static inline timer2 *
tm2_new_init(pool *p, void (*hook)(struct timer2 *), void *data, uint rec, uint rand)
{
  timer2 *t = tm2_new(p);
  t->hook = hook;
  t->data = data;
  t->recurrent = rec;
  t->randomize = rand;
  return t;
}

static inline void
tm2_set_max(timer2 *t, btime when)
{
  if (when > t->expires)
    tm2_set(t, when);
}

/*
static inline void
tm2_start_max(timer2 *t, btime after)
{
  btime rem = tm2_remains(t);
  tm2_start(t, _MAX(rem, after));
}
*/


void sk_start(sock *s);
void sk_stop(sock *s);



struct birdloop *birdloop_new(void);
void birdloop_start(struct birdloop *loop);
void birdloop_stop(struct birdloop *loop);
void birdloop_free(struct birdloop *loop);

void birdloop_enter(struct birdloop *loop);
void birdloop_leave(struct birdloop *loop);
void birdloop_mask_wakeups(struct birdloop *loop);
void birdloop_unmask_wakeups(struct birdloop *loop);


#endif /* _BIRD_BFD_IO_H_ */