From 6b6f2290a74475bbdb7fb9a1d8fd4c04023596aa Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Fri, 11 Oct 2013 10:03:51 +0100 Subject: [PATCH] [cache_dump/restore] add discards to the xml format --- caching/emitter.h | 6 ++++++ caching/restore_emitter.cc | 15 +++++++++++++++ caching/xml_format.cc | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/caching/emitter.h b/caching/emitter.h index 1563cdc..8a01d6c 100644 --- a/caching/emitter.h +++ b/caching/emitter.h @@ -37,6 +37,12 @@ namespace caching { virtual void hint(pd::block_address cblock, std::vector const &data) = 0; + + virtual void begin_discards() = 0; + virtual void end_discards() = 0; + + virtual void discard(pd::block_address dblock_begin, + pd::block_address dblock_end) = 0; }; } diff --git a/caching/restore_emitter.cc b/caching/restore_emitter.cc index 787163c..6c862bf 100644 --- a/caching/restore_emitter.cc +++ b/caching/restore_emitter.cc @@ -78,7 +78,22 @@ namespace { virtual void hint(pd::block_address cblock, vector const &data) { + md_->hints_->set_hint(cblock, data); + } + virtual void begin_discards() { + // noop + } + + virtual void end_discards() { + // noop + } + + virtual void discard(block_address dblock, block_address dblock_e) { + while (dblock != dblock_e) { + md_->discard_bits_->set(dblock, true); + dblock++; + } } private: diff --git a/caching/xml_format.cc b/caching/xml_format.cc index 71b7823..b03e997 100644 --- a/caching/xml_format.cc +++ b/caching/xml_format.cc @@ -88,6 +88,24 @@ namespace { << "/>" << endl; } + virtual void begin_discards() { + indent(); + out_ << "" << endl; + inc(); + } + + virtual void end_discards() { + dec(); + indent(); + out_ << "" << endl; + } + + virtual void discard(block_address dblock_b, block_address dblock_e) { + indent(); + out_ << "" << endl; + } + private: string as_truth(bool v) const { return v ? "true" : "false"; @@ -196,6 +214,12 @@ namespace { e->hint(cblock, get >(doe)); } + // FIXME: why passing e by ptr? + void parse_discard(emitter *e, attributes const &attr) { + e->discard(get_attr(attr, "dbegin"), + get_attr(attr, "dend")); + } + void start_tag(void *data, char const *el, char const **attr) { emitter *e = static_cast(data); attributes a; @@ -217,6 +241,12 @@ namespace { else if (!strcmp(el, "hint")) parse_hint(e, a); + else if (!strcmp(el, "discards")) + e->begin_discards(); + + else if (!strcmp(el, "discard")) + parse_discard(e, a); + else throw runtime_error("unknown tag type"); } @@ -241,6 +271,13 @@ namespace { // do nothing ; + else if (!strcmp(el, "discards")) + e->end_discards(); + + else if (!strcmp(el, "discard")) + // do nothing + ; + else throw runtime_error("unknown tag close"); }