[Assorted-commits] SF.net SVN: assorted:[1491] cpp-commons/trunk/src/commons/versioned_heap.h
Brought to you by:
yangzhang
From: <yan...@us...> - 2009-10-14 18:06:41
|
Revision: 1491 http://assorted.svn.sourceforge.net/assorted/?rev=1491&view=rev Author: yangzhang Date: 2009-10-14 18:06:33 +0000 (Wed, 14 Oct 2009) Log Message: ----------- added partial serialization/deserialization to versioned_heap Modified Paths: -------------- cpp-commons/trunk/src/commons/versioned_heap.h Modified: cpp-commons/trunk/src/commons/versioned_heap.h =================================================================== --- cpp-commons/trunk/src/commons/versioned_heap.h 2009-10-14 18:05:48 UTC (rev 1490) +++ cpp-commons/trunk/src/commons/versioned_heap.h 2009-10-14 18:06:33 UTC (rev 1491) @@ -349,6 +349,14 @@ } /** + * Deserialize a heap partially in place. + */ + void deser_partial(void *meta, void *data, size_t page_count) { + desermeta_partial(meta); + deserdata_partial(data, page_count); + } + + /** * Iterator. */ iterator begin() { return iterator(*this); } @@ -389,6 +397,24 @@ return r.read<size_t>(); } + void desermeta_partial(void *meta) { + raw_reader r(meta); + + // Deserialize metadata. + size_t first_free, last_free; + r.read(first_free); + r.read(last_free); + first_free_ = reinterpret_cast<hdr*>(first_free); + last_free_ = reinterpret_cast<hdr*>(last_free); + // TODO why do next 2 lines this give me this warning? + // error: dereferencing type-punned pointer will break strict-aliasing rules + //r.read(reinterpret_cast<size_t&>(first_free_)); + //r.read(reinterpret_cast<size_t&>(last_free_)); + r.read(pgsz_); + compute_layout<T>(pgsz_, pgcnt_, values_offset_, freemap_words_); + r.read<size_t>(); + } + /** * Deserialize a heap in place. */ @@ -402,6 +428,27 @@ } } + /** + * Deserialize a partial heap in place. + */ + void deserdata_partial(void *data, size_t page_count) { + char *p0 = reinterpret_cast<char*>(data); + char *end = p0 + page_count * pgsz_; + for (char *p = p0; p < end; p += pgsz_) { + hdr &h = hdrof(p); + + check(h.index <= pages_.size()); + if (h.index < pages_.size()) pages_[h.index] = p; + else pages_.push_back(p); + + h.managed = false; + } + for (char *p = p0; p < end; p += pgsz_) { + hdrof(p).next_free = reinterpret_cast<hdr*>(pages_[size_t(hdrof(p).next_free)]); + } + first_free_ = reinterpret_cast<hdr*>(pages_[size_t(first_free_)]); + } + }; /** @@ -433,7 +480,39 @@ } } + /** + * \param[in] summary The start of the summary page entries. + * \param[in] summary_count The number of page entries in the summary. + */ template<typename T> + size_t serdata_partial(const versioned_heap<T> &heap, void *out, + raw_reader &summary_reader, size_t summary_count) + { + char *p = reinterpret_cast<char*>(out); + size_t i = 0, ser_count = 0; + foreach (void *page, heap.pages()) { + typedef typename versioned_heap<T>::hdr hdr; + hdr &h = *reinterpret_cast<hdr*>(page); + assert(i == h.index); + bool do_ser = true; + if (i < summary_count) { + checkeq(summary_reader.read<size_t>(), i); + // Serialize iff the other heap is behind our version. + do_ser = summary_reader.read<int>() < h.version; + } + if (do_ser) { + memcpy(p, page, heap.pgsz()); + ++ser_count; + hdr &h = *reinterpret_cast<hdr*>(p); + ptr2ind_mut(h.next_free); + p += heap.pgsz(); + } + ++i; + } + return ser_count; + } + + template<typename T> size_t ptr2ind(T *p) { return p == nullptr ? size_t(-1) : p->index; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |