lsquic_mm.h revision 229fce07
1229fce07SDmitri Tikhonov/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc.  See LICENSE. */
250aadb33SDmitri Tikhonov/*
350aadb33SDmitri Tikhonov * lsquic_mm.h -- Memory manager.
450aadb33SDmitri Tikhonov *
550aadb33SDmitri Tikhonov * Allocators and in this class are meant to be used for the lifetime of
650aadb33SDmitri Tikhonov * QUIC engine.
750aadb33SDmitri Tikhonov */
850aadb33SDmitri Tikhonov
950aadb33SDmitri Tikhonov#ifndef LSQUIC_MM_H
1050aadb33SDmitri Tikhonov#define LSQUIC_MM_H 1
1150aadb33SDmitri Tikhonov
1250aadb33SDmitri Tikhonovstruct lsquic_engine_public;
1350aadb33SDmitri Tikhonovstruct lsquic_packet_in;
1450aadb33SDmitri Tikhonovstruct lsquic_packet_out;
1550aadb33SDmitri Tikhonovstruct ack_info;
1650aadb33SDmitri Tikhonovstruct malo;
1750aadb33SDmitri Tikhonov
1850aadb33SDmitri Tikhonov#define MM_N_OUT_BUCKETS 3
1950aadb33SDmitri Tikhonov
2050aadb33SDmitri Tikhonovstruct lsquic_mm {
2150aadb33SDmitri Tikhonov    struct ack_info     *acki;
2250aadb33SDmitri Tikhonov    struct {
2350aadb33SDmitri Tikhonov        struct malo     *stream_frame;  /* For struct stream_frame */
2450aadb33SDmitri Tikhonov        struct malo     *stream_rec_arr;/* For struct stream_rec_arr */
2550aadb33SDmitri Tikhonov        struct malo     *packet_in;     /* For struct lsquic_packet_in */
2650aadb33SDmitri Tikhonov        struct malo     *packet_out;    /* For struct lsquic_packet_out */
2750aadb33SDmitri Tikhonov    }                    malo;
2850aadb33SDmitri Tikhonov    TAILQ_HEAD(, lsquic_packet_in)  free_packets_in;
2950aadb33SDmitri Tikhonov    SLIST_HEAD(, packet_out_buf)    packet_out_bufs[MM_N_OUT_BUCKETS];
3050aadb33SDmitri Tikhonov    SLIST_HEAD(, payload_buf)       payload_bufs;
3150aadb33SDmitri Tikhonov    SLIST_HEAD(, four_k_page)       four_k_pages;
3250aadb33SDmitri Tikhonov    SLIST_HEAD(, sixteen_k_page)    sixteen_k_pages;
3350aadb33SDmitri Tikhonov};
3450aadb33SDmitri Tikhonov
3550aadb33SDmitri Tikhonovint
3650aadb33SDmitri Tikhonovlsquic_mm_init (struct lsquic_mm *);
3750aadb33SDmitri Tikhonov
3850aadb33SDmitri Tikhonovvoid
3950aadb33SDmitri Tikhonovlsquic_mm_cleanup (struct lsquic_mm *);
4050aadb33SDmitri Tikhonov
4150aadb33SDmitri Tikhonovstruct lsquic_packet_in *
4250aadb33SDmitri Tikhonovlsquic_mm_get_packet_in (struct lsquic_mm *);
4350aadb33SDmitri Tikhonov
4450aadb33SDmitri Tikhonovvoid
4550aadb33SDmitri Tikhonovlsquic_mm_put_packet_in (struct lsquic_mm *, struct lsquic_packet_in *);
4650aadb33SDmitri Tikhonov
4750aadb33SDmitri Tikhonov#define lsquic_packet_in_put(mm, p) do {                                \
4850aadb33SDmitri Tikhonov    assert((p)->pi_refcnt != 0);                                        \
4950aadb33SDmitri Tikhonov    if (--(p)->pi_refcnt == 0)                                          \
5050aadb33SDmitri Tikhonov        lsquic_mm_put_packet_in(mm, p);                                 \
5150aadb33SDmitri Tikhonov} while (0)
5250aadb33SDmitri Tikhonov
5350aadb33SDmitri Tikhonovstruct lsquic_packet_out *
5450aadb33SDmitri Tikhonovlsquic_mm_get_packet_out (struct lsquic_mm *, struct malo *,
5550aadb33SDmitri Tikhonov                          unsigned short size);
5650aadb33SDmitri Tikhonov
5750aadb33SDmitri Tikhonovvoid
5850aadb33SDmitri Tikhonovlsquic_mm_put_packet_out (struct lsquic_mm *, struct lsquic_packet_out *);
5950aadb33SDmitri Tikhonov
6050aadb33SDmitri Tikhonovvoid *
6150aadb33SDmitri Tikhonovlsquic_mm_get_1370 (struct lsquic_mm *);
6250aadb33SDmitri Tikhonov
6350aadb33SDmitri Tikhonovvoid
6450aadb33SDmitri Tikhonovlsquic_mm_put_1370 (struct lsquic_mm *, void *);
6550aadb33SDmitri Tikhonov
6650aadb33SDmitri Tikhonovvoid *
6750aadb33SDmitri Tikhonovlsquic_mm_get_4k (struct lsquic_mm *);
6850aadb33SDmitri Tikhonov
6950aadb33SDmitri Tikhonovvoid
7050aadb33SDmitri Tikhonovlsquic_mm_put_4k (struct lsquic_mm *, void *);
7150aadb33SDmitri Tikhonov
7250aadb33SDmitri Tikhonovvoid *
7350aadb33SDmitri Tikhonovlsquic_mm_get_16k (struct lsquic_mm *);
7450aadb33SDmitri Tikhonov
7550aadb33SDmitri Tikhonovvoid
7650aadb33SDmitri Tikhonovlsquic_mm_put_16k (struct lsquic_mm *, void *);
7750aadb33SDmitri Tikhonov
78c51ce338SDmitri Tikhonovsize_t
79c51ce338SDmitri Tikhonovlsquic_mm_mem_used (const struct lsquic_mm *mm);
80c51ce338SDmitri Tikhonov
8150aadb33SDmitri Tikhonov#endif
82