2025-08-10 01:34:16 +02:00

102 lines
2.4 KiB
C++

#pragma once
#include <components/chunkfetcher/ChunkFetcherSlave.h>
#include <common/toolkit/ListTk.h>
#include <mutex>
#define MAX_CHUNKLIST_SIZE 5000
// forward declaration
class ChunkFetcher;
typedef std::list<ChunkFetcherSlave> ChunkFetcherSlaveList;
typedef ChunkFetcherSlaveList::iterator ChunkFetcherSlaveListIter;
/**
* This is not a component that represents a separate thread. Instead, it contains and controls
* slave threads, which are started and stopped on request (i.e. they are not automatically started
* when the app is started).
* The slave threads will run over all chunks on all targets and read them in a format suitable for
* fsck
*/
class ChunkFetcher
{
public:
ChunkFetcher();
virtual ~ChunkFetcher();
bool startFetching();
void stopFetching();
void waitForStopFetching();
private:
LogContext log;
ChunkFetcherSlaveList slaves;
FsckChunkList chunksList;
Mutex chunksListMutex;
Condition chunksListFetchedCondition;
bool isBad;
public:
bool getIsBad()
{
const std::lock_guard<Mutex> lock(chunksListMutex);
return isBad;
}
void setBad()
{
const std::lock_guard<Mutex> lock(chunksListMutex);
isBad = true;
}
void addChunk(FsckChunk& chunk)
{
const std::lock_guard<Mutex> lock(chunksListMutex);
if (chunksList.size() > MAX_CHUNKLIST_SIZE)
chunksListFetchedCondition.wait(&chunksListMutex);
chunksList.push_back(chunk);
}
bool isQueueEmpty()
{
std::lock_guard<Mutex> lock(chunksListMutex);
return chunksList.empty();
}
void getAndDeleteChunks(FsckChunkList& outList, unsigned numChunks)
{
const std::lock_guard<Mutex> lock(chunksListMutex);
FsckChunkListIter iterEnd = this->chunksList.begin();
ListTk::advance(this->chunksList, iterEnd, numChunks);
outList.splice(outList.end(), this->chunksList, this->chunksList.begin(), iterEnd);
chunksListFetchedCondition.signal();
}
unsigned getNumRunning()
{
unsigned retVal = 0;
for (ChunkFetcherSlaveListIter iter = slaves.begin(); iter != slaves.end(); iter++)
{
const std::lock_guard<Mutex> lock(iter->statusMutex);
if ( iter->isRunning )
retVal++;
}
return retVal;
}
};