11#ifndef SRC_QUIC_NODE_QUIC_UTIL_INL_H_
22#define SRC_QUIC_NODE_QUIC_UTIL_INL_H_
33
4+ #include " debug_utils.h"
45#include " node_internals.h"
6+ #include " node_quic_crypto.h"
57#include " node_quic_util.h"
68#include " memory_tracker-inl.h"
79#include " env-inl.h"
@@ -324,7 +326,7 @@ StatsBase<T>::StatsBase(
324326 int options)
325327 : stats_buffer_(
326328 env->isolate (),
327- sizeof(T ) / sizeof(uint64_t ),
329+ sizeof(typename T::Stats ) / sizeof(uint64_t ),
328330 reinterpret_cast<uint64_t*>(&stats_)) {
329331 static constexpr uint64_t kMax = std::numeric_limits<int64_t >::max ();
330332 stats_.created_at = uv_hrtime ();
@@ -368,30 +370,29 @@ StatsBase<T>::StatsBase(
368370}
369371
370372template <typename T>
371- void StatsBase<T>::IncrementStat(uint64_t T::*member, uint64_t amount) {
373+ void StatsBase<T>::IncrementStat(uint64_t T::Stats:: *member, uint64_t amount) {
372374 static constexpr uint64_t kMax = std::numeric_limits<uint64_t >::max ();
373375 stats_.*member += std::min (amount, kMax - stats_.*member);
374376}
375377
376378template <typename T>
377- void StatsBase<T>::SetStat(uint64_t T::*member, uint64_t value) {
379+ void StatsBase<T>::SetStat(uint64_t T::Stats:: *member, uint64_t value) {
378380 stats_.*member = value;
379381}
380382
381383template <typename T>
382- void StatsBase<T>::RecordTimestamp(uint64_t T::*member) {
384+ void StatsBase<T>::RecordTimestamp(uint64_t T::Stats:: *member) {
383385 stats_.*member = uv_hrtime ();
384386}
385387
386388template <typename T>
387- uint64_t StatsBase<T>::GetStat(uint64_t T::*member) const {
389+ uint64_t StatsBase<T>::GetStat(uint64_t T::Stats:: *member) const {
388390 return stats_.*member;
389391}
390392
391393template <typename T>
392- inline void StatsBase<T>::RecordRate(uint64_t T::*member) {
394+ inline void StatsBase<T>::RecordRate(uint64_t T::Stats:: *member) {
393395 CHECK (rate_);
394-
395396 uint64_t received_at = GetStat (member);
396397 uint64_t now = uv_hrtime ();
397398 if (received_at > 0 )
@@ -406,7 +407,7 @@ inline void StatsBase<T>::RecordSize(uint64_t val) {
406407}
407408
408409template <typename T>
409- inline void StatsBase<T>::RecordAck(uint64_t T::*member) {
410+ inline void StatsBase<T>::RecordAck(uint64_t T::Stats:: *member) {
410411 CHECK (ack_);
411412 uint64_t acked_at = GetStat (member);
412413 uint64_t now = uv_hrtime ();
@@ -423,6 +424,29 @@ void StatsBase<T>::StatsMemoryInfo(MemoryTracker* tracker) const {
423424 tracker->TrackField (" ack_histogram" , ack_);
424425}
425426
427+ template <typename T>
428+ StatsBase<T>::~StatsBase () {
429+ StatsBase<T>::StatsDebug stats_debug (static_cast <typename T::Base*>(this ));
430+ Debug (static_cast <typename T::Base*>(this ),
431+ " Destroyed. %s" ,
432+ stats_debug.ToString ().c_str ());
433+ }
434+
435+ template <typename T>
436+ std::string StatsBase<T>::StatsDebug::ToString() const {
437+ std::string out = " Statistics:\n " ;
438+ auto add_field = [&out](const char * name, uint64_t val) {
439+ out += " " ;
440+ out += std::string (name);
441+ out += " : " ;
442+ out += std::to_string (val);
443+ out += " \n " ;
444+ };
445+ add_field (" Duration" , uv_hrtime () - ptr->GetStat (&T::Stats::created_at));
446+ T::ToString (*ptr, add_field);
447+ return out;
448+ }
449+
426450template <typename T>
427451size_t get_length (const T* vec, size_t count) {
428452 CHECK_NOT_NULL (vec);
0 commit comments