BIND 10 trac2850_4, updated. 85fcde63692e73b4ac783d2300851b94578575c9 [2850] Cache the header address for read-only segments

BIND 10 source code commits bind10-changes at lists.isc.org
Fri May 24 08:12:52 UTC 2013


The branch, trac2850_4 has been updated
       via  85fcde63692e73b4ac783d2300851b94578575c9 (commit)
       via  9440c155bc74679a5a9526c1507384790a62a057 (commit)
      from  c226db710c71f94fe3506a588bcd4566cab5b2dd (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 85fcde63692e73b4ac783d2300851b94578575c9
Author: Mukund Sivaraman <muks at isc.org>
Date:   Fri May 24 13:20:46 2013 +0530

    [2850] Cache the header address for read-only segments

commit 9440c155bc74679a5a9526c1507384790a62a057
Author: Mukund Sivaraman <muks at isc.org>
Date:   Fri May 24 13:32:17 2013 +0530

    [2850] Update if statement slightly (doesn't change behavior)

-----------------------------------------------------------------------

Summary of changes:
 .../datasrc/memory/zone_table_segment_mapped.cc    |   18 +++++++++++++++---
 src/lib/datasrc/memory/zone_table_segment_mapped.h |    3 ++-
 src/lib/util/memory_segment.h                      |    3 +--
 3 files changed, 18 insertions(+), 6 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
index e529764..330107f 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
@@ -286,6 +286,12 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
     current_filename_ = filename;
     current_mode_ = mode;
     mem_sgmt_.reset(segment.release());
+
+    if (!isWritable()) {
+        // Given what we setup above, the following must not throw at
+        // this point. If it does, all bets are off.
+        cached_ro_header_ = getHeaderHelper<ZoneTableHeader>(true);
+    }
 }
 
 void
@@ -319,12 +325,18 @@ ZoneTableSegmentMapped::clear() {
 
 template<typename T>
 T*
-ZoneTableSegmentMapped::getHeaderHelper() const {
+ZoneTableSegmentMapped::getHeaderHelper(bool initial) const {
     if (!isUsable()) {
         isc_throw(isc::InvalidOperation,
                   "getHeader() called without calling reset() first");
     }
 
+    if (!isWritable() && !initial) {
+        // The header address would not have changed since reset() for
+        // READ_ONLY segments.
+        return (cached_ro_header_);
+    }
+
     const MemorySegment::NamedAddressResult result =
         mem_sgmt_->getNamedAddress(ZONE_TABLE_HEADER_NAME);
     if (!result.first) {
@@ -340,12 +352,12 @@ ZoneTableSegmentMapped::getHeaderHelper() const {
 
 ZoneTableHeader&
 ZoneTableSegmentMapped::getHeader() {
-    return (*getHeaderHelper<ZoneTableHeader>());
+    return (*getHeaderHelper<ZoneTableHeader>(false));
 }
 
 const ZoneTableHeader&
 ZoneTableSegmentMapped::getHeader() const {
-    return (*getHeaderHelper<const ZoneTableHeader>());
+    return (*getHeaderHelper<const ZoneTableHeader>(false));
 }
 
 MemorySegment&
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h
index aaae285..1776314 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.h
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.h
@@ -124,7 +124,7 @@ private:
                                                   bool create);
     isc::util::MemorySegmentMapped* openReadOnly(const std::string& filename);
 
-    template<typename T> T* getHeaderHelper() const;
+    template<typename T> T* getHeaderHelper(bool initial) const;
 
 private:
     std::string impl_type_;
@@ -134,6 +134,7 @@ private:
     // 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* cached_ro_header_;
 };
 
 } // namespace memory
diff --git a/src/lib/util/memory_segment.h b/src/lib/util/memory_segment.h
index b2050ff..11c1ce2 100644
--- a/src/lib/util/memory_segment.h
+++ b/src/lib/util/memory_segment.h
@@ -326,8 +326,7 @@ private:
     static void validateName(const char* name) {
         if (!name) {
             isc_throw(InvalidParameter, "NULL is invalid for a name.");
-        }
-        if (*name == '\0') {
+        } else if (*name == '\0') {
             isc_throw(InvalidParameter, "Empty names are invalid.");
         } else if (*name == '_') {
             isc_throw(InvalidParameter,



More information about the bind10-changes mailing list