/* */ #include "SpeedCalc.h" #include namespace aria2 { #define CHANGE_INTERVAL_SEC 15 class Reset { public: void operator()(Time& tm) { tm.reset(); } }; void SpeedCalc::reset() { std::fill(&lengthArray[0], &lengthArray[2], 0); std::for_each(&cpArray[0], &cpArray[2], Reset()); sw = 0; maxSpeed = 0; prevSpeed = 0; start.reset(); accumulatedLength = 0; nextInterval = CHANGE_INTERVAL_SEC; } int32_t SpeedCalc::calculateSpeed() { int32_t milliElapsed = cpArray[sw].differenceInMillis(); if(milliElapsed) { int32_t speed = lengthArray[sw]*1000/milliElapsed; prevSpeed = speed; maxSpeed = std::max(speed, maxSpeed); return speed; } else { return prevSpeed; } } int32_t SpeedCalc::calculateSpeed(const struct timeval& now) { int64_t milliElapsed = cpArray[sw].differenceInMillis(now); if(milliElapsed) { int32_t speed = lengthArray[sw]*1000/milliElapsed; prevSpeed = speed; maxSpeed = std::max(speed, maxSpeed); return speed; } else { return prevSpeed; } } class Plus { private: int32_t d; public: Plus(int32_t d):d(d) {} void operator()(int64_t& length) { length += d; } }; void SpeedCalc::update(int bytes) { accumulatedLength += bytes; std::for_each(&lengthArray[0], &lengthArray[2], Plus(bytes)); if(isIntervalOver()) { changeSw(); } } bool SpeedCalc::isIntervalOver() const { return nextInterval <= cpArray[sw].difference(); } void SpeedCalc::changeSw() { lengthArray[sw] = 0; cpArray[sw].reset(); sw ^= 0x01; nextInterval = cpArray[sw].difference()+CHANGE_INTERVAL_SEC; } int32_t SpeedCalc::getAvgSpeed() const { int32_t milliElapsed = start.differenceInMillis(); if(milliElapsed) { int32_t speed = accumulatedLength*1000/milliElapsed; return speed; } else { return 0; } } } // namespace aria2