lsquic_attq.h revision 06b2a236
1/* Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc.  See LICENSE. */
2/*
3 * lsquic_attq.h -- Advisory Tick Time Queue
4 */
5
6#ifndef LSQUIC_ATTQ_H
7#define LSQUIC_ATTQ_H
8
9struct attq;
10struct lsquic_conn;
11
12
13/* The extra level of indirection is done for speed: swapping heap elements
14 * does not need memory associated with lsquic_conn.
15 */
16struct attq_elem
17{
18    struct lsquic_conn  *ae_conn;
19    lsquic_time_t        ae_adv_time;
20    unsigned             ae_heap_idx;
21    /* The "why" describes why the connection is in the Advisory Tick Time
22     * Queue.  Values past the range describe different alarm types (see
23     * enum alarm_id).
24     */
25    enum ae_why {
26        AEW_PACER,
27        AEW_MINI_EXPIRE,
28        N_AEWS
29    }                    ae_why;
30};
31
32
33struct attq *
34lsquic_attq_create (void);
35
36void
37lsquic_attq_destroy (struct attq *);
38
39/* Return 0 on success, -1 on failure (malloc) */
40int
41lsquic_attq_add (struct attq *, struct lsquic_conn *, lsquic_time_t advisory_time,
42                enum ae_why);
43
44void
45lsquic_attq_remove (struct attq *, struct lsquic_conn *);
46
47struct lsquic_conn *
48lsquic_attq_pop (struct attq *, lsquic_time_t cutoff);
49
50unsigned
51lsquic_attq_count_before (struct attq *, lsquic_time_t cutoff);
52
53const struct attq_elem *
54lsquic_attq_next (struct attq *);
55
56const char *
57lsquic_attq_why2str (enum ae_why);
58
59#endif
60