libzypp  17.37.5
DownloadProgressTracker.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
10 
11 #include <algorithm>
12 
13 namespace zypp::internal {
14 
15 void ProgressTracker::updateStats(double dltotal, double dlnow)
16 {
17  clock::time_point now = clock::now();
18 
19  if ( !_timeStart )
20  _timeStart = _timeLast = now;
21 
22  // If called without args (0.0), recompute based on the last values seen
23  if ( dltotal && dltotal != _dnlTotal )
24  _dnlTotal = dltotal;
25 
26  if ( dlnow && dlnow != _dnlNow ) {
27  _dnlNow = dlnow;
28  }
29 
30  // percentage:
31  if ( _dnlTotal )
32  _dnlPercent = int(_dnlNow * 100 / _dnlTotal);
33 
34  // download rates:
35  _drateTotal = _dnlNow / std::max( std::chrono::duration_cast<std::chrono::seconds>(now - *_timeStart).count(), int64_t(1) );
36 
37  if ( _timeLast < now )
38  {
39  const auto duration = std::chrono::duration_cast<std::chrono::seconds>(now - *_timeLast).count();
40  if ( duration >= 1 ) {
41  _drateLast = (_dnlNow - _dnlLast) / duration;
42  // start new period
43  _timeLast = now;
44  _dnlLast = _dnlNow;
45  }
46  }
47  else if ( _timeStart == _timeLast )
49 }
50 
51 }
void updateStats(double dltotal=0.0, double dlnow=0.0)
double _dnlNow
Bytes downloaded now.
double _dnlLast
Bytes downloaded at period start.
double _dnlTotal
Bytes to download or 0 if unknown.
double _drateTotal
Download rate so far.
std::optional< clock::time_point > _timeLast
Start last period(~1sec)
std::optional< clock::time_point > _timeStart
Start total stats.
int _dnlPercent
Percent completed or 0 if _dnlTotal is unknown.
double _drateLast
Download rate in last period.