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
|
#include "session_internal.h"
#include "session_timer.h"
#ifndef container_of
#define container_of(ptr, type, member) \
(type *)((char *)(ptr) - (char *)&((type *)0)->member)
#endif
struct session_timer
{
struct timeouts *timeouts;
};
struct session_timer *session_timer_new(uint64_t now)
{
timeout_error_t err;
struct session_timer *timer = (struct session_timer *)calloc(1, sizeof(struct session_timer));
if (timer == NULL)
{
return NULL;
}
timer->timeouts = timeouts_open(0, &err);
if (timer->timeouts == NULL)
{
goto error;
}
timeouts_update(timer->timeouts, now);
return timer;
error:
session_timer_free(timer);
return NULL;
}
void session_timer_free(struct session_timer *timer)
{
if (timer)
{
if (timer->timeouts)
{
timeouts_close(timer->timeouts);
}
free(timer);
timer = NULL;
}
}
void session_timer_add(struct session_timer *timer, struct session *sess, uint64_t expires)
{
timeout_init(&sess->timeout, TIMEOUT_ABS);
timeouts_add(timer->timeouts, &sess->timeout, expires);
}
void session_timer_del(struct session_timer *timer, struct session *sess)
{
timeouts_del(timer->timeouts, &sess->timeout);
}
void session_timer_update(struct session_timer *timer, struct session *sess, uint64_t expires)
{
session_timer_del(timer, sess);
session_timer_add(timer, sess, expires);
}
struct session *session_timer_expire(struct session_timer *timer, uint64_t now)
{
timeouts_update(timer->timeouts, now);
struct timeout *timeout = timeouts_get(timer->timeouts);
if (timeout == NULL)
{
return NULL;
}
return container_of(timeout, struct session, timeout);
}
uint64_t session_timer_next_expire_interval(struct session_timer *timer)
{
return timeouts_timeout(timer->timeouts);
}
|