From f6655a1138a11e80884959014939a25f23a1e308 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 26 May 2018 21:26:03 +0200 Subject: Use steady clock source for bandwidth limitation Using the time of day for this is slightly wrong just like it is for progress, just less visible. --- methods/http.cc | 18 +++++++++--------- methods/http.h | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index 1933d9d00..2e7fca307 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -49,7 +50,7 @@ using namespace std; unsigned long long CircleBuf::BwReadLimit=0; unsigned long long CircleBuf::BwTickReadData=0; -struct timeval CircleBuf::BwReadTick={0,0}; +std::chrono::steady_clock::duration CircleBuf::BwReadTick{0}; const unsigned int CircleBuf::BW_HZ=10; // CircleBuf::CircleBuf - Circular input buffer /*{{{*/ @@ -98,18 +99,17 @@ bool CircleBuf::Read(std::unique_ptr const &Fd) unsigned long long const BwReadMax = CircleBuf::BwReadLimit/BW_HZ; if(CircleBuf::BwReadLimit) { - struct timeval now; - gettimeofday(&now,0); + auto const now = std::chrono::steady_clock::now().time_since_epoch(); + auto const d = now - CircleBuf::BwReadTick; - unsigned long long d = (now.tv_sec-CircleBuf::BwReadTick.tv_sec)*1000000 + - now.tv_usec-CircleBuf::BwReadTick.tv_usec; - if(d > 1000000/BW_HZ) { + auto const tickLen = std::chrono::microseconds(std::chrono::seconds(1)) / BW_HZ; + if(d > tickLen) { CircleBuf::BwReadTick = now; CircleBuf::BwTickReadData = 0; - } - + } + if(CircleBuf::BwTickReadData >= BwReadMax) { - usleep(1000000/BW_HZ); + usleep(tickLen.count()); return true; } } diff --git a/methods/http.h b/methods/http.h index ae6cedc13..5668f0b87 100644 --- a/methods/http.h +++ b/methods/http.h @@ -12,6 +12,7 @@ #include +#include #include #include #include @@ -39,7 +40,7 @@ class CircleBuf static unsigned long long BwReadLimit; static unsigned long long BwTickReadData; - static struct timeval BwReadTick; + static std::chrono::steady_clock::duration BwReadTick; static const unsigned int BW_HZ; unsigned long long LeftRead() const -- cgit v1.2.3