BIND 10 trac2850_2, updated. 6548cfede8e4f8fb9457eb62b0c458969a358155 [2850] Unify checksum and header processing code
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri May 3 08:44:02 UTC 2013
The branch, trac2850_2 has been updated
via 6548cfede8e4f8fb9457eb62b0c458969a358155 (commit)
from 02c2f7f80e6d858233a595cae04842666fbd29c8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 6548cfede8e4f8fb9457eb62b0c458969a358155
Author: Mukund Sivaraman <muks at isc.org>
Date: Fri May 3 14:13:49 2013 +0530
[2850] Unify checksum and header processing code
-----------------------------------------------------------------------
Summary of changes:
.../datasrc/memory/zone_table_segment_mapped.cc | 125 ++++++++++----------
src/lib/datasrc/memory/zone_table_segment_mapped.h | 3 +
2 files changed, 67 insertions(+), 61 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
index 41c8c2b..a5d2c43 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
@@ -42,36 +42,74 @@ ZoneTableSegmentMapped::ZoneTableSegmentMapped(const RRClass& rrclass) :
}
void
-ZoneTableSegmentMapped::openCreate(const std::string& filename) {
- // In case there is a checksum mismatch, we throw. We want the
- // segment to be automatically destroyed then.
- std::auto_ptr<MemorySegmentMapped> segment
- (new MemorySegmentMapped(filename, MemorySegmentMapped::CREATE_ONLY));
- // There must be no previously saved checksum.
+ZoneTableSegmentMapped::processChecksum(MemorySegmentMapped& segment,
+ bool createMode)
+{
MemorySegment::NamedAddressResult result =
- segment->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
+ segment.getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
if (result.first) {
- isc_throw(isc::Unexpected,
- "There is already a saved checksum in a mapped segment "
- "opened in create mode.");
+ if (createMode) {
+ // There must be no previously saved checksum.
+ isc_throw(isc::Unexpected,
+ "There is already a saved checksum in a mapped segment "
+ "opened in create mode.");
+ } else {
+ // The segment was already shrunk when it was last
+ // closed. Check that its checksum is consistent.
+ assert(result.second);
+ uint32_t* checksum = static_cast<uint32_t*>(result.second);
+ const uint32_t saved_checksum = *checksum;
+ // First, clear the checksum so that getCheckSum() returns a
+ // consistent value.
+ *checksum = 0;
+ const uint32_t new_checksum = segment.getCheckSum();
+ if (saved_checksum != new_checksum) {
+ isc_throw(isc::Unexpected,
+ "Saved checksum doesn't match mapped segment data");
+ }
+ }
+ } else {
+ // Allocate space for a checksum (which is saved during close).
+ void* checksum = segment.allocate(sizeof(uint32_t));
+ *static_cast<uint32_t*>(checksum) = 0;
+ segment.setNamedAddress(ZONE_TABLE_CHECKSUM_NAME, checksum);
}
- // Allocate space for a checksum (which is saved during close).
- void* checksum = segment->allocate(sizeof(uint32_t));
- *static_cast<uint32_t*>(checksum) = 0;
- segment->setNamedAddress(ZONE_TABLE_CHECKSUM_NAME, checksum);
+}
- // There must be no previously saved ZoneTableHeader.
- result = segment->getNamedAddress(ZONE_TABLE_HEADER_NAME);
+void
+ZoneTableSegmentMapped::processHeader(MemorySegmentMapped& segment,
+ bool createMode)
+{
+ MemorySegment::NamedAddressResult result =
+ segment.getNamedAddress(ZONE_TABLE_HEADER_NAME);
if (result.first) {
- isc_throw(isc::Unexpected,
- "There is already a saved ZoneTableHeader in a "
- "mapped segment opened in create mode.");
+ if (createMode) {
+ // There must be no previously saved checksum.
+ isc_throw(isc::Unexpected,
+ "There is already a saved ZoneTableHeader in a "
+ "mapped segment opened in create mode.");
+ } else {
+ assert(result.second);
+ header_ = static_cast<ZoneTableHeader*>(result.second);
+ }
+ } else {
+ void* ptr = segment.allocate(sizeof(ZoneTableHeader));
+ ZoneTableHeader* new_header = new(ptr)
+ ZoneTableHeader(ZoneTable::create(segment, rrclass_));
+ segment.setNamedAddress(ZONE_TABLE_HEADER_NAME, new_header);
+ header_ = new_header;
}
- void* ptr = segment->allocate(sizeof(ZoneTableHeader));
- ZoneTableHeader* new_header = new(ptr)
- ZoneTableHeader(ZoneTable::create(*segment, rrclass_));
- segment->setNamedAddress(ZONE_TABLE_HEADER_NAME, new_header);
- header_ = new_header;
+}
+
+void
+ZoneTableSegmentMapped::openCreate(const std::string& filename) {
+ // In case there is a checksum mismatch, we throw. We want the
+ // segment to be automatically destroyed then.
+ std::auto_ptr<MemorySegmentMapped> segment
+ (new MemorySegmentMapped(filename, MemorySegmentMapped::CREATE_ONLY));
+
+ processChecksum(*segment, true);
+ processHeader(*segment, true);
mem_sgmt_.reset(segment.release());
}
@@ -83,44 +121,9 @@ ZoneTableSegmentMapped::openReadWrite(const std::string& filename) {
std::auto_ptr<MemorySegmentMapped> segment
(new MemorySegmentMapped(filename,
MemorySegmentMapped::OPEN_OR_CREATE));
- // If there is a previously saved checksum, verify that it is
- // consistent. Otherwise, allocate space for a checksum (which is
- // saved during close).
- MemorySegment::NamedAddressResult result =
- segment->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
- if (result.first) {
- // The segment was already shrunk when it was last closed. Check
- // that its checksum is consistent.
- assert(result.second);
- uint32_t* checksum = static_cast<uint32_t*>(result.second);
- const uint32_t saved_checksum = *checksum;
- // First, clear the checksum so that getCheckSum() returns a
- // consistent value.
- *checksum = 0;
- const uint32_t new_checksum = segment->getCheckSum();
- if (saved_checksum != new_checksum) {
- isc_throw(isc::Unexpected,
- "Saved checksum doesn't match mapped segment data");
- }
- } else {
- void* checksum = segment->allocate(sizeof(uint32_t));
- *static_cast<uint32_t*>(checksum) = 0;
- segment->setNamedAddress(ZONE_TABLE_CHECKSUM_NAME, checksum);
- }
- // If there is a previously saved ZoneTableHeader, use
- // it. Otherwise, allocate a new header.
- result = segment->getNamedAddress(ZONE_TABLE_HEADER_NAME);
- if (result.first) {
- assert(result.second);
- header_ = static_cast<ZoneTableHeader*>(result.second);
- } else {
- void* ptr = segment->allocate(sizeof(ZoneTableHeader));
- ZoneTableHeader* new_header = new(ptr)
- ZoneTableHeader(ZoneTable::create(*segment, rrclass_));
- segment->setNamedAddress(ZONE_TABLE_HEADER_NAME, new_header);
- header_ = new_header;
- }
+ processChecksum(*segment, false);
+ processHeader(*segment, false);
mem_sgmt_.reset(segment.release());
}
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h
index a7d281e..f6455b3 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.h
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.h
@@ -98,6 +98,9 @@ public:
isc::data::ConstElementPtr params);
private:
+ void processChecksum(isc::util::MemorySegmentMapped& segment, bool create);
+ void processHeader(isc::util::MemorySegmentMapped& segment, bool create);
+
void openCreate(const std::string& filename);
void openReadWrite(const std::string& filename);
void openReadOnly(const std::string& filename);
More information about the bind10-changes
mailing list