1a74702c6SGeorge Wang/* Copyright (c) 2017 - 2022 LiteSpeed Technologies Inc. See LICENSE. */ 250aadb33SDmitri Tikhonov#include <time.h> 3461e84d8SAmol Deshpande#ifdef WIN32 4461e84d8SAmol Deshpande#include <vc_compat.h> 5461e84d8SAmol Deshpande#define localtime_r(a,b) localtime_s(b,a) 6461e84d8SAmol Deshpande#endif 750aadb33SDmitri Tikhonov 850aadb33SDmitri Tikhonov#include "lsquic_eng_hist.h" 950aadb33SDmitri Tikhonov 1050aadb33SDmitri Tikhonov#if ENG_HIST_ENABLED 1150aadb33SDmitri Tikhonov 1250aadb33SDmitri Tikhonov#define LSQUIC_LOGGER_MODULE LSQLM_ENG_HIST 135392f7a3SLiteSpeed Tech#include "lsquic_types.h" 1450aadb33SDmitri Tikhonov#include "lsquic_logger.h" 1550aadb33SDmitri Tikhonov 1650aadb33SDmitri Tikhonov 1750aadb33SDmitri Tikhonovstatic void 1850aadb33SDmitri Tikhonovlog_hist_slice (const struct hist_slice *slice, time_t t) 1950aadb33SDmitri Tikhonov{ 2050aadb33SDmitri Tikhonov size_t strftime(char *s, size_t max, const char *format, 2150aadb33SDmitri Tikhonov const struct tm *tm); 2250aadb33SDmitri Tikhonov if (slice->sl_packets_in == 0 && 2350aadb33SDmitri Tikhonov slice->sl_packets_out == 0 && 2450aadb33SDmitri Tikhonov slice->sl_del_mini_conns == 0 && 2550aadb33SDmitri Tikhonov slice->sl_del_full_conns == 0) 2650aadb33SDmitri Tikhonov return; 2750aadb33SDmitri Tikhonov 2850aadb33SDmitri Tikhonov struct tm tm; 2950aadb33SDmitri Tikhonov char timestr[sizeof("12:00:00")]; 3050aadb33SDmitri Tikhonov 3150aadb33SDmitri Tikhonov localtime_r(&t, &tm); 3250aadb33SDmitri Tikhonov strftime(timestr, sizeof(timestr), "%T", &tm); 3350aadb33SDmitri Tikhonov 3450aadb33SDmitri Tikhonov LSQ_DEBUG("%s: pi: %u; po: %u; +mc: %u; -mc: %u; +fc: %u; -fc: %u", 3550aadb33SDmitri Tikhonov timestr, 3650aadb33SDmitri Tikhonov slice->sl_packets_in, 3750aadb33SDmitri Tikhonov slice->sl_packets_out, 3850aadb33SDmitri Tikhonov slice->sl_new_mini_conns, 3950aadb33SDmitri Tikhonov slice->sl_del_mini_conns, 4050aadb33SDmitri Tikhonov slice->sl_new_full_conns, 4150aadb33SDmitri Tikhonov slice->sl_del_full_conns); 4250aadb33SDmitri Tikhonov} 4350aadb33SDmitri Tikhonov 4450aadb33SDmitri Tikhonov 4550aadb33SDmitri Tikhonovvoid 46a5fa05f9SDmitri Tikhonovlsquic_eng_hist_log (const struct eng_hist *hist) 4750aadb33SDmitri Tikhonov{ 4850aadb33SDmitri Tikhonov unsigned i, idx; 4950aadb33SDmitri Tikhonov time_t t0 = time(NULL) - ENG_HIST_NELEMS + 1; 5050aadb33SDmitri Tikhonov for (i = 0; i < ENG_HIST_NELEMS; ++i) 5150aadb33SDmitri Tikhonov { 5250aadb33SDmitri Tikhonov idx = (hist->eh_prev_idx + i + 1) & (ENG_HIST_NELEMS - 1); 5350aadb33SDmitri Tikhonov if (i >= ENG_HIST_NELEMS - ENG_HIST_N_TO_PRINT) 5450aadb33SDmitri Tikhonov log_hist_slice(&hist->eh_slices[idx], t0 + i); 5550aadb33SDmitri Tikhonov } 5650aadb33SDmitri Tikhonov} 5750aadb33SDmitri Tikhonov 5850aadb33SDmitri Tikhonov#endif 59