summaryrefslogtreecommitdiffstats
path: root/installerbuilder
diff options
context:
space:
mode:
authorAlexander Lenhardt <alexander.lenhardt@nokia.com>2011-10-14 10:21:49 +0200
committerAlexander Lenhardt <alexander.lenhardt@nokia.com>2011-10-14 15:22:44 +0200
commit7267db9a8535ffe49a71bda041cb2e72f9d21109 (patch)
treef0f5622dcb1c394688b54551bdbccd239e866bde /installerbuilder
parent21976ed67604aa844373a1eb337ff3153e353c08 (diff)
improvements for moving average
Change-Id: I981cee1ed666b89596b05527281cbc556a7ae7c1 Reviewed-by: Karsten Heimrich <karsten.heimrich@nokia.com>
Diffstat (limited to 'installerbuilder')
-rw-r--r--installerbuilder/libinstaller/3rdparty/kdtools/KDUpdater/kdupdaterfiledownloader.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/installerbuilder/libinstaller/3rdparty/kdtools/KDUpdater/kdupdaterfiledownloader.cpp b/installerbuilder/libinstaller/3rdparty/kdtools/KDUpdater/kdupdaterfiledownloader.cpp
index 7bfe86824..39293b4f5 100644
--- a/installerbuilder/libinstaller/3rdparty/kdtools/KDUpdater/kdupdaterfiledownloader.cpp
+++ b/installerbuilder/libinstaller/3rdparty/kdtools/KDUpdater/kdupdaterfiledownloader.cpp
@@ -199,8 +199,11 @@ struct KDUpdater::FileDownloader::FileDownloaderData
{
FileDownloaderData()
: autoRemove( true )
+ , m_speedTimerInterval(100)
, m_bytesReceived(0)
, m_bytesToReceive(0)
+ , m_currentSpeedBin(0)
+ , m_sampleIndex(0)
, m_downloadSpeed(0)
{
memset(m_samples, 0, sizeof(m_samples));
@@ -214,11 +217,14 @@ struct KDUpdater::FileDownloader::FileDownloaderData
bool followRedirect;
QBasicTimer m_timer;
+ int m_speedTimerInterval;
qint64 m_bytesReceived;
qint64 m_bytesToReceive;
- mutable qint64 m_samples[10];
+ mutable qint64 m_samples[50];
+ mutable qint64 m_currentSpeedBin;
+ mutable quint32 m_sampleIndex;
mutable qint64 m_downloadSpeed;
};
@@ -331,7 +337,7 @@ void KDUpdater::FileDownloader::cancelDownload()
void KDUpdater::FileDownloader::runDownloadSpeedTimer()
{
if (!d->m_timer.isActive())
- d->m_timer.start(500, this);
+ d->m_timer.start(d->m_speedTimerInterval, this);
}
void KDUpdater::FileDownloader::stopDownloadSpeedTimer()
@@ -341,7 +347,7 @@ void KDUpdater::FileDownloader::stopDownloadSpeedTimer()
void KDUpdater::FileDownloader::addSample(qint64 sample)
{
- d->m_samples[0] += sample;
+ d->m_currentSpeedBin += sample;
}
int KDUpdater::FileDownloader::downloadSpeedTimerId() const
@@ -357,14 +363,25 @@ void KDUpdater::FileDownloader::setProgress(qint64 bytesReceived, qint64 bytesTo
void KDUpdater::FileDownloader::emitDownloadSpeed()
{
- for (int i = 8; i >= 0; --i)
- d->m_samples[i + 1] = d->m_samples[i];
- d->m_samples[0] = 0;
+ unsigned int windowSize = sizeof(d->m_samples) / sizeof(qint64);
+ // add speed of last time bin to the window
+ d->m_samples[d->m_sampleIndex % windowSize] = d->m_currentSpeedBin;
+ d->m_currentSpeedBin = 0; // reset bin for next time interval
+
+ // advance the sample index
+ d->m_sampleIndex++;
d->m_downloadSpeed = 0;
- for (unsigned int i = 0; i < sizeof(d->m_samples) / sizeof(qint64); ++i)
+
+ // dynamic window size until the window is completely filled
+ if (d->m_sampleIndex < windowSize)
+ windowSize = d->m_sampleIndex;
+
+ for (unsigned int i = 0; i < windowSize; ++i)
d->m_downloadSpeed += d->m_samples[i];
- d->m_downloadSpeed /= (sizeof(d->m_samples) / sizeof(qint64) - 1) * 0.5;
+
+ d->m_downloadSpeed /= windowSize; // computer average
+ d->m_downloadSpeed *= 1000.0 / d->m_speedTimerInterval; // rescale to bytes/second
emit downloadSpeed(d->m_downloadSpeed);
}