Add functionality for clearing the cache between runs.

This commit is contained in:
David Given
2022-09-10 21:27:14 +02:00
parent 085ad5f2a4
commit 6b228d7a0a
5 changed files with 71 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ LIBFLUXENGINE_SRCS = \
lib/decoders/fluxmapreader.cc \
lib/decoders/fmmfm.cc \
lib/encoders/encoders.cc \
lib/environment.cc \
lib/flags.cc \
lib/fluxmap.cc \
lib/fluxsink/a2rfluxsink.cc \

17
lib/environment.cc Normal file
View File

@@ -0,0 +1,17 @@
#include "lib/globals.h"
#include "lib/environment.h"
static std::unique_ptr<std::set<LocalBase*>> variables;
void Environment::reset()
{
for (LocalBase* var : *variables)
var->reset();
}
void Environment::addVariable(LocalBase* local)
{
if (!variables)
variables = std::make_unique<std::set<LocalBase*>>();
variables->insert(local);
}

44
lib/environment.h Normal file
View File

@@ -0,0 +1,44 @@
#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H
class LocalBase;
class Environment
{
public:
static void reset();
static void addVariable(LocalBase* local);
};
class LocalBase
{
public:
virtual void reset() = 0;
};
template <class T>
class Local : LocalBase
{
public:
Local()
{
Environment::addVariable(this);
}
void reset() override
{
_value.clear();
}
T& operator*()
{
return _value;
}
T& operator->()
{
return _value;
}
private:
T _value;
};
#endif

View File

@@ -1,9 +1,11 @@
#include "lib/globals.h"
#include "lib/layout.h"
#include "lib/proto.h"
#include "lib/environment.h"
#include <fmt/format.h>
static std::map<std::pair<int, int>, std::unique_ptr<Layout>> layoutCache;
static Local<std::map<std::pair<int, int>, std::unique_ptr<Layout>>>
layoutCache;
std::vector<std::pair<int, int>> Layout::getTrackOrdering(
unsigned guessedTracks, unsigned guessedSides)
@@ -66,7 +68,7 @@ static void expandSectors(const LayoutProto::SectorsProto& sectorsProto,
const Layout& Layout::getLayoutOfTrack(unsigned track, unsigned side)
{
auto& layout = layoutCache[std::make_pair(track, side)];
auto& layout = (*layoutCache)[std::make_pair(track, side)];
if (!layout)
{
layout.reset(new Layout());

View File

@@ -18,6 +18,7 @@
#include "utils.h"
#include "lib/config.pb.h"
#include "proto.h"
#include "environment.h"
#include <optional>
enum ReadResult
@@ -228,6 +229,7 @@ void writeTracks(FluxSink& fluxSink,
std::function<bool(const Location& location)> verifier,
const std::set<Location>& locations)
{
Environment::reset();
Logger() << BeginOperationLogMessage{"Encoding and writing to disk"};
int index = 0;
@@ -416,6 +418,7 @@ void writeRawDiskCommand(FluxSource& fluxSource, FluxSink& fluxSink)
std::shared_ptr<TrackFlux> readAndDecodeTrack(
FluxSource& fluxSource, AbstractDecoder& decoder, const Location& location)
{
Environment::reset();
auto trackFlux = std::make_shared<TrackFlux>();
trackFlux->location = location;
@@ -450,6 +453,7 @@ std::shared_ptr<TrackFlux> readAndDecodeTrack(
std::shared_ptr<const DiskFlux> readDiskCommand(
FluxSource& fluxSource, AbstractDecoder& decoder)
{
Environment::reset();
std::unique_ptr<FluxSink> outputFluxSink;
if (config.decoder().has_copy_flux_to())
outputFluxSink = FluxSink::create(config.decoder().copy_flux_to());
@@ -565,6 +569,7 @@ void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink)
{
Logger() << BeginOperationLogMessage{"Performing raw read of disk"};
Environment::reset();
auto tracks = iterate(config.tracks());
auto heads = iterate(config.heads());
unsigned locations = tracks.size() * heads.size();