diff --git a/src/LogFile.cpp b/src/LogFile.cpp index 79fb00a..874fecc 100644 --- a/src/LogFile.cpp +++ b/src/LogFile.cpp @@ -31,6 +31,8 @@ LogFile::LogFile(const std::string& fileName, bool verbose) : filename(fileName) descriptions = indexFile->getStreamDescriptions(); LOG_DEBUG_S << "Found " << descriptions.size() << " stream in logfile " << getFileName(); streams = createStreamsFromDescriptions(descriptions, indexFile); + + runSampleThread(); } void LogFile::removeAllIndexes() { @@ -69,6 +71,10 @@ std::vector LogFile::createStreamsFromDescriptions( LogFile::~LogFile() { + + runThread = false; + readThread.join(); + for (size_t i = 0; i < streams.size(); i++) { delete streams[i]; } @@ -315,18 +321,51 @@ OwnedValue LogFile::getSample(std::vector& buffer) { } optional LogFile::readNextSample() { - while (readNextBlockHeader()) { - if (curBlockHeader.type == DataBlockType) { - uint16_t stream_idx = curBlockHeader.stream_idx; - readSampleHeader(); - return optional( - make_tuple(stream_idx, getSampleTime(), getSample()) - ); - } + queueMutex.lock(); + if (sampleQueue.size()) { + Sample returnSample = sampleQueue.front(); + sampleQueue.pop_front(); + queueMutex.unlock(); + return optional(returnSample); } + queueMutex.unlock(); + usleep(100000); return optional(); } +bool LogFile::runSampleThread() { + readThread = std::thread([&](){ + runThread = true; + while (runThread){ + + queueMutex.lock(); + size_t qsize = sampleQueue.size(); + queueMutex.unlock(); + + if (qsize < 25) { + while (readNextBlockHeader()) { + if (curBlockHeader.type == DataBlockType) { + uint16_t stream_idx = curBlockHeader.stream_idx; + readSampleHeader(); + + queueMutex.lock(); + sampleQueue.push_back(make_tuple(stream_idx, getSampleTime(), getSample())); + queueMutex.unlock(); + + } else { + //runThread = false; + usleep(100000); + } + } + } else { + usleep(100000); + } + + } + }); + return true; +} + bool LogFile::eof() const { return logFile.eof(); diff --git a/src/LogFile.hpp b/src/LogFile.hpp index 3023656..8cb88f2 100644 --- a/src/LogFile.hpp +++ b/src/LogFile.hpp @@ -3,6 +3,10 @@ #include #include #include +#include +#include +#include +#include #include "Stream.hpp" #include "Format.hpp" #include "FileStream.hpp" @@ -75,6 +79,14 @@ class LogFile using Sample = std::tuple; std::optional readNextSample(); + bool runSampleThread(); + std::atomic runThread; + + std::deque sampleQueue; + std::mutex queueMutex; + + + std::thread readThread; bool eof() const;