Packages
hackney
3.0.3
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/lsquic/src/liblsquic/lsquic_eng_hist.h
/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */
/*
* lsquic_eng_hist.h - Engine history.
*
* Keep track of new and destroyed connections, packets in and packets out.
*/
#ifndef LSQUIC_ENG_HIST
#define LSQUIC_ENG_HIST
#define ENG_HIST_ENABLED 1
#define ENG_HIST_BITS 2
#define ENG_HIST_NELEMS (1 << ENG_HIST_BITS)
#ifndef ENG_HIST_N_TO_PRINT
/* By default, we do not print the whole history every second just
* the latest entry.
*/
# define ENG_HIST_N_TO_PRINT 1
#endif
/* Keeps history per slice of time -- one second */
struct hist_slice
{
unsigned sl_packets_in,
sl_packets_out,
sl_new_full_conns,
sl_new_mini_conns,
sl_del_full_conns,
sl_del_mini_conns;
};
struct eng_hist
{
struct hist_slice eh_slices[ENG_HIST_NELEMS];
unsigned eh_cur_idx,
eh_prev_idx;
};
#if ENG_HIST_ENABLED
/* Initialize engine history */
#define eng_hist_init(eh) do { \
memset(eh, 0, sizeof(*(eh))); \
(eh)->eh_cur_idx = (eh)->eh_prev_idx = \
time(NULL) & (ENG_HIST_NELEMS - 1); \
} while (0)
/* Clear slice at current index */
#define eng_hist_clear_cur(eh) do { \
memset(&(eh)->eh_slices[(eh)->eh_cur_idx], 0, \
sizeof(struct hist_slice)); \
} while (0)
void
lsquic_eng_hist_log (const struct eng_hist *);
/* Switch to next slice if necessary */
#define eng_hist_tick(eh, now) do { \
if (0 == (now)) \
(eh)->eh_cur_idx = time(NULL) & (ENG_HIST_NELEMS - 1); \
else \
(eh)->eh_cur_idx = ((now) / 1000000) & (ENG_HIST_NELEMS - 1); \
if ((eh)->eh_cur_idx != (eh)->eh_prev_idx) \
{ \
lsquic_eng_hist_log(eh); \
eng_hist_clear_cur(eh); \
(eh)->eh_prev_idx = (eh)->eh_cur_idx; \
} \
} while (0)
/* Increment element `what'. Slice increment is handled in this macro, too. */
#define eng_hist_inc(eh, now, what) do { \
eng_hist_tick(eh, now); \
++(eh)->eh_slices[(eh)->eh_cur_idx].what; \
} while (0)
#else /* !ENG_HIST_ENABLED */
#define eng_hist_init(eh)
#define eng_hist_clear_cur(eh)
#define eng_hist_tick(eh, now)
#define eng_hist_inc(eh, now, what)
#define lsquic_eng_hist_log(eh)
#endif /* ENG_HIST_ENABLED */
#endif /* LSQUIC_ENG_HIST */