1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_attq.h -- Advisory Tick Time Queue
450aadb33SDmitri Tikhonov */
550aadb33SDmitri Tikhonov
650aadb33SDmitri Tikhonov#ifndef LSQUIC_ATTQ_H
750aadb33SDmitri Tikhonov#define LSQUIC_ATTQ_H
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonovstruct attq;
1050aadb33SDmitri Tikhonovstruct lsquic_conn;
1150aadb33SDmitri Tikhonov
1250aadb33SDmitri Tikhonov
1350aadb33SDmitri Tikhonov/* The extra level of indirection is done for speed: swapping heap elements
1450aadb33SDmitri Tikhonov * does not need memory associated with lsquic_conn.
1550aadb33SDmitri Tikhonov */
1650aadb33SDmitri Tikhonovstruct attq_elem
1750aadb33SDmitri Tikhonov{
1850aadb33SDmitri Tikhonov    struct lsquic_conn  *ae_conn;
1950aadb33SDmitri Tikhonov    lsquic_time_t        ae_adv_time;
2050aadb33SDmitri Tikhonov    unsigned             ae_heap_idx;
210adf085aSDmitri Tikhonov    /* The "why" describes why the connection is in the Advisory Tick Time
220adf085aSDmitri Tikhonov     * Queue.  Values past the range describe different alarm types (see
230adf085aSDmitri Tikhonov     * enum alarm_id).
240adf085aSDmitri Tikhonov     */
250adf085aSDmitri Tikhonov    enum ae_why {
260adf085aSDmitri Tikhonov        AEW_PACER,
270adf085aSDmitri Tikhonov        AEW_MINI_EXPIRE,
280adf085aSDmitri Tikhonov        N_AEWS
290adf085aSDmitri Tikhonov    }                    ae_why;
3050aadb33SDmitri Tikhonov};
3150aadb33SDmitri Tikhonov
3250aadb33SDmitri Tikhonov
3350aadb33SDmitri Tikhonovstruct attq *
34a5fa05f9SDmitri Tikhonovlsquic_attq_create (void);
3550aadb33SDmitri Tikhonov
3650aadb33SDmitri Tikhonovvoid
37a5fa05f9SDmitri Tikhonovlsquic_attq_destroy (struct attq *);
3850aadb33SDmitri Tikhonov
3950aadb33SDmitri Tikhonov/* Return 0 on success, -1 on failure (malloc) */
4050aadb33SDmitri Tikhonovint
41a5fa05f9SDmitri Tikhonovlsquic_attq_add (struct attq *, struct lsquic_conn *, lsquic_time_t advisory_time,
420adf085aSDmitri Tikhonov                enum ae_why);
4350aadb33SDmitri Tikhonov
4450aadb33SDmitri Tikhonovvoid
45a5fa05f9SDmitri Tikhonovlsquic_attq_remove (struct attq *, struct lsquic_conn *);
4650aadb33SDmitri Tikhonov
4750aadb33SDmitri Tikhonovstruct lsquic_conn *
48a5fa05f9SDmitri Tikhonovlsquic_attq_pop (struct attq *, lsquic_time_t cutoff);
4950aadb33SDmitri Tikhonov
5050aadb33SDmitri Tikhonovunsigned
51a5fa05f9SDmitri Tikhonovlsquic_attq_count_before (struct attq *, lsquic_time_t cutoff);
5250aadb33SDmitri Tikhonov
530adf085aSDmitri Tikhonovconst struct attq_elem *
54a5fa05f9SDmitri Tikhonovlsquic_attq_next (struct attq *);
550adf085aSDmitri Tikhonov
560adf085aSDmitri Tikhonovconst char *
570adf085aSDmitri Tikhonovlsquic_attq_why2str (enum ae_why);
5850aadb33SDmitri Tikhonov
5950aadb33SDmitri Tikhonov#endif
60