From 3565bfe34d60309b5947257ff27f8cbc5c0ffa0c Mon Sep 17 00:00:00 2001 From: Nate Weibley Date: Fri, 5 Feb 2016 20:17:23 -0500 Subject: [PATCH] Switch to hash table for gaps and reposition the file when starting to fill a new segment --- src/ViewWidgets/LogDownloadController.cc | 27 ++++++++++++++---------- src/ViewWidgets/LogDownloadController.h | 14 ++++++------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/ViewWidgets/LogDownloadController.cc b/src/ViewWidgets/LogDownloadController.cc index a4399e4f8..7718d5224 100644 --- a/src/ViewWidgets/LogDownloadController.cc +++ b/src/ViewWidgets/LogDownloadController.cc @@ -282,16 +282,7 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui // Check for a gap qint64 pos = _downloadData->file.pos(); if (pos != ofs) { - // Check for a gap collision - if (_downloadData->gaps.contains(ofs)) { - // The gap is being filled. Shrink it - const int32_t gap = _downloadData->gaps.take(ofs) - count; - if (gap > 0) { - _downloadData->gaps[ofs+count] = qMax(static_cast(gap), _downloadData->gaps.value(ofs+count, 0)); - } else { - timeout_time = 20; - } - } else if (pos < ofs) { + if (pos < ofs) { // Mind the gap uint32_t gap = ofs - pos; _downloadData->gaps[pos] = gap; @@ -304,6 +295,17 @@ LogDownloadController::_logData(UASInterface* uas, uint32_t ofs, uint16_t id, ui } } + // Check for a gap collision + if (_downloadData->gaps.contains(ofs)) { + // The gap is being filled. Shrink it + const int32_t gap = _downloadData->gaps.take(ofs) - count; + if (gap > 0) { + _downloadData->gaps[ofs+count] = qMax(static_cast(gap), _downloadData->gaps.value(ofs+count, 0)); + } else { + timeout_time = 20; + } + } + //-- Write chunk to file if(_downloadData->file.write((const char*)data, count)) { _downloadData->written += count; @@ -378,9 +380,12 @@ LogDownloadController::_findMissingData() const qint64 pos = _downloadData->file.pos(), size = _downloadData->entry->size(); if (!_downloadData->gaps.isEmpty()) { - const uint32_t start = _downloadData->gaps.firstKey(); + auto keys = _downloadData->gaps.keys(); + qSort(keys); + const uint32_t start = keys.first(); const uint32_t count = _downloadData->gaps.value(start); + _downloadData->file.seek(start); //-- Request these log chunks again _requestLogData(_downloadData->ID, start, count); } else if (pos != size) { diff --git a/src/ViewWidgets/LogDownloadController.h b/src/ViewWidgets/LogDownloadController.h index d27c9dbea..40ba3b125 100644 --- a/src/ViewWidgets/LogDownloadController.h +++ b/src/ViewWidgets/LogDownloadController.h @@ -125,13 +125,13 @@ private: //----------------------------------------------------------------------------- struct LogDownloadData { LogDownloadData(QGCLogEntry* entry); - QMap gaps; - QFile file; - QString filename; - uint ID; - QGCLogEntry* entry; - uint written; - QElapsedTimer elapsed; + QHash gaps; + QFile file; + QString filename; + uint ID; + QGCLogEntry* entry; + uint written; + QElapsedTimer elapsed; }; //----------------------------------------------------------------------------- -- 2.22.0