summaryrefslogtreecommitdiff
path: root/infra/session_manager/session_timer.c
blob: 46e78fb571edc6e9fde5aa0f74c4c41e9de38bf9 (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
#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);
}