diff --git a/lib/build.mk b/lib/build.mk index 6c93d99c..3baf2ec0 100644 --- a/lib/build.mk +++ b/lib/build.mk @@ -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 \ diff --git a/lib/environment.cc b/lib/environment.cc new file mode 100644 index 00000000..feda7fd5 --- /dev/null +++ b/lib/environment.cc @@ -0,0 +1,17 @@ +#include "lib/globals.h" +#include "lib/environment.h" + +static std::unique_ptr> variables; + +void Environment::reset() +{ + for (LocalBase* var : *variables) + var->reset(); +} + +void Environment::addVariable(LocalBase* local) +{ + if (!variables) + variables = std::make_unique>(); + variables->insert(local); +} diff --git a/lib/environment.h b/lib/environment.h new file mode 100644 index 00000000..1295b4d0 --- /dev/null +++ b/lib/environment.h @@ -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 Local : LocalBase +{ +public: + Local() + { + Environment::addVariable(this); + } + void reset() override + { + _value.clear(); + } + T& operator*() + { + return _value; + } + T& operator->() + { + return _value; + } + +private: + T _value; +}; + +#endif diff --git a/lib/layout.cc b/lib/layout.cc index 8b3e51f6..2bbf8717 100644 --- a/lib/layout.cc +++ b/lib/layout.cc @@ -1,9 +1,11 @@ #include "lib/globals.h" #include "lib/layout.h" #include "lib/proto.h" +#include "lib/environment.h" #include -static std::map, std::unique_ptr> layoutCache; +static Local, std::unique_ptr>> + layoutCache; std::vector> 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()); diff --git a/lib/readerwriter.cc b/lib/readerwriter.cc index 8811af9b..42a8e96b 100644 --- a/lib/readerwriter.cc +++ b/lib/readerwriter.cc @@ -18,6 +18,7 @@ #include "utils.h" #include "lib/config.pb.h" #include "proto.h" +#include "environment.h" #include enum ReadResult @@ -228,6 +229,7 @@ void writeTracks(FluxSink& fluxSink, std::function verifier, const std::set& 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 readAndDecodeTrack( FluxSource& fluxSource, AbstractDecoder& decoder, const Location& location) { + Environment::reset(); auto trackFlux = std::make_shared(); trackFlux->location = location; @@ -450,6 +453,7 @@ std::shared_ptr readAndDecodeTrack( std::shared_ptr readDiskCommand( FluxSource& fluxSource, AbstractDecoder& decoder) { + Environment::reset(); std::unique_ptr 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();