BIND 10 trac2850_2, updated. ca15d37a2e8d6eff63b52eb5fef0e8d3bdb3e2c2 [2850] Split large switch block into methods
BIND 10 source code commits
bind10-changes at lists.isc.org
Fri May 3 06:39:24 UTC 2013
The branch, trac2850_2 has been updated
via ca15d37a2e8d6eff63b52eb5fef0e8d3bdb3e2c2 (commit)
from 10386454c422828a5d46a3b927b1c284e6216372 (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 ca15d37a2e8d6eff63b52eb5fef0e8d3bdb3e2c2
Author: Mukund Sivaraman <muks at isc.org>
Date: Fri May 3 12:09:01 2013 +0530
[2850] Split large switch block into methods
-----------------------------------------------------------------------
Summary of changes:
.../datasrc/memory/zone_table_segment_mapped.cc | 226 +++++++++++---------
src/lib/datasrc/memory/zone_table_segment_mapped.h | 9 +-
2 files changed, 130 insertions(+), 105 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
index cabf399..2bc7603 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
@@ -42,6 +42,123 @@ 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.
+ MemorySegment::NamedAddressResult result =
+ 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.");
+ }
+ // 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);
+ if (result.first) {
+ isc_throw(isc::Unexpected,
+ "There is already a saved ZoneTableHeader in a "
+ "mapped segment opened in create mode.");
+ }
+ 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;
+
+ mem_sgmt_.reset(segment.release());
+}
+
+void
+ZoneTableSegmentMapped::openReadWrite(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::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;
+ }
+
+ mem_sgmt_.reset(segment.release());
+}
+
+void
+ZoneTableSegmentMapped::openReadOnly(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));
+ // There must be a previously saved checksum.
+ MemorySegment::NamedAddressResult result =
+ segment->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
+ if (!result.first) {
+ isc_throw(isc::Unexpected,
+ "There is no previously saved checksum in a "
+ "mapped segment opened in read-only mode.");
+ }
+
+ // We can't verify the checksum here as we can't set the checksum to
+ // 0 for checksum calculation in a read-only segment. So we continue
+ // without verifying the checksum.
+
+ // There must be a previously saved ZoneTableHeader.
+ result = segment->getNamedAddress(ZONE_TABLE_HEADER_NAME);
+ if (result.first) {
+ assert(result.second);
+ header_ = static_cast<ZoneTableHeader*>(result.second);
+ } else {
+ isc_throw(isc::Unexpected,
+ "There is no previously saved ZoneTableHeader in a "
+ "mapped segment opened in read-only mode.");
+ }
+
+ mem_sgmt_.reset(segment.release());
+}
+
+void
ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
isc::data::ConstElementPtr params)
{
@@ -86,117 +203,20 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
const std::string filename = mapped_file->stringValue();
- // In case there is a checksum mismatch, we throw. We want the
- // segment to be automatically destroyed then.
- std::auto_ptr<MemorySegmentMapped> segment;
-
switch (mode) {
- case CREATE: {
- segment.reset(new MemorySegmentMapped
- (filename,
- MemorySegmentMapped::CREATE_ONLY));
- // There must be no previously saved checksum.
- MemorySegment::NamedAddressResult result =
- 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.");
- }
- // 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);
- if (result.first) {
- isc_throw(isc::Unexpected,
- "There is already a saved ZoneTableHeader in a "
- "mapped segment opened in create mode.");
- }
- 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;
-
+ case CREATE:
+ openCreate(filename);
break;
- }
- case READ_WRITE: {
- segment.reset(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;
- }
+ case READ_WRITE:
+ openReadWrite(filename);
break;
- }
- case READ_ONLY: {
- segment.reset(new MemorySegmentMapped(filename));
- // There must be a previously saved checksum.
- MemorySegment::NamedAddressResult result =
- segment->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
- if (!result.first) {
- isc_throw(isc::Unexpected,
- "There is no previously saved checksum in a "
- "mapped segment opened in read-only mode.");
- }
- // We can't verify the checksum here as we can't set the
- // checksum to 0 for checksum calculation in a read-only
- // segment. So we continue without verifying the checksum.
-
- // There must be a previously saved ZoneTableHeader.
- result = segment->getNamedAddress(ZONE_TABLE_HEADER_NAME);
- if (result.first) {
- assert(result.second);
- header_ = static_cast<ZoneTableHeader*>(result.second);
- } else {
- isc_throw(isc::Unexpected,
- "There is no previously saved ZoneTableHeader in a "
- "mapped segment opened in read-only mode.");
- }
- }
+ case READ_ONLY:
+ openReadOnly(filename);
}
current_mode_ = mode;
- mem_sgmt_.reset(segment.release());
}
// After more methods' definitions are added here, it would be a good
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h
index 17cbf91..a7d281e 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.h
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.h
@@ -98,10 +98,15 @@ public:
isc::data::ConstElementPtr params);
private:
- // Internally holds a MemorySegmentMapped. This is NULL on
- // construction, and is set by the \c reset() method.
+ void openCreate(const std::string& filename);
+ void openReadWrite(const std::string& filename);
+ void openReadOnly(const std::string& filename);
+
+private:
isc::dns::RRClass rrclass_;
MemorySegmentOpenMode current_mode_;
+ // Internally holds a MemorySegmentMapped. This is NULL on
+ // construction, and is set by the \c reset() method.
boost::scoped_ptr<isc::util::MemorySegmentMapped> mem_sgmt_;
ZoneTableHeader* header_;
};
More information about the bind10-changes
mailing list