BIND 10 trac2850_2, updated. e6d1be1a6718874ab37b0f403c3e266c90bcdf87 [2850] Handle current_filename_ assignment causing an exception

BIND 10 source code commits bind10-changes at lists.isc.org
Wed May 8 11:33:14 UTC 2013


The branch, trac2850_2 has been updated
       via  e6d1be1a6718874ab37b0f403c3e266c90bcdf87 (commit)
       via  148c5bbf6132ac5b149a0a97286f13ec212443cb (commit)
       via  4542e8960d4accbef74ac41e5082209f3776b5b8 (commit)
      from  56d109e8a0c5d46ac542870723ba324aa2425b88 (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 e6d1be1a6718874ab37b0f403c3e266c90bcdf87
Author: Mukund Sivaraman <muks at isc.org>
Date:   Wed May 8 17:02:16 2013 +0530

    [2850] Handle current_filename_ assignment causing an exception

commit 148c5bbf6132ac5b149a0a97286f13ec212443cb
Author: Mukund Sivaraman <muks at isc.org>
Date:   Wed May 8 16:54:30 2013 +0530

    [2850] Make getHeader() return the current address of header
    
    It could have been relocated since its construction.

commit 4542e8960d4accbef74ac41e5082209f3776b5b8
Author: Mukund Sivaraman <muks at isc.org>
Date:   Wed May 8 16:43:41 2013 +0530

    [2850] Remove obsolete comment

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

Summary of changes:
 .../datasrc/memory/zone_table_segment_mapped.cc    |   58 +++++++++++---------
 src/lib/datasrc/memory/zone_table_segment_mapped.h |    8 ++-
 2 files changed, 38 insertions(+), 28 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
index c5ea53a..3140f90 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.cc
@@ -36,8 +36,7 @@ const char* const ZONE_TABLE_HEADER_NAME = "zone_table_header";
 
 ZoneTableSegmentMapped::ZoneTableSegmentMapped(const RRClass& rrclass) :
     ZoneTableSegment(rrclass),
-    rrclass_(rrclass),
-    header_(NULL)
+    rrclass_(rrclass)
 {
 }
 
@@ -121,7 +120,6 @@ ZoneTableSegmentMapped::processHeader(MemorySegmentMapped& segment,
             return (false);
         } else {
             assert(result.second);
-            header_ = static_cast<ZoneTableHeader*>(result.second);
         }
     } else {
         // First allocate a ZONE_TABLE_HEADER_NAME, so that we can set
@@ -150,13 +148,12 @@ ZoneTableSegmentMapped::processHeader(MemorySegmentMapped& segment,
             error_msg = "Segment grew unexpectedly in setNamedAddress()";
             return (false);
         }
-        header_ = new_header;
     }
 
     return (true);
 }
 
-void
+MemorySegmentMapped*
 ZoneTableSegmentMapped::openReadWrite(const std::string& filename,
                                       bool create)
 {
@@ -182,10 +179,10 @@ ZoneTableSegmentMapped::openReadWrite(const std::string& filename,
          }
     }
 
-    mem_sgmt_.reset(segment.release());
+    return (segment.release());
 }
 
-void
+MemorySegmentMapped*
 ZoneTableSegmentMapped::openReadOnly(const std::string& filename) {
     // In case the checksum or table header is missing, we throw. We
     // want the segment to be automatically destroyed then.
@@ -217,7 +214,6 @@ ZoneTableSegmentMapped::openReadOnly(const std::string& filename) {
     result = segment->getNamedAddress(ZONE_TABLE_HEADER_NAME);
     if (result.first) {
         assert(result.second);
-        header_ = static_cast<ZoneTableHeader*>(result.second);
     } else {
          const std::string error_msg =
              "There is no previously saved ZoneTableHeader in a "
@@ -233,7 +229,7 @@ ZoneTableSegmentMapped::openReadOnly(const std::string& filename) {
          }
     }
 
-    mem_sgmt_.reset(segment.release());
+    return (segment.release());
 }
 
 void
@@ -267,21 +263,26 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
         sync();
     }
 
+    // In case current_filename_ below fails, we want the segment to be
+    // automatically destroyed.
+    std::auto_ptr<MemorySegmentMapped> segment;
+
     switch (mode) {
     case CREATE:
-        openReadWrite(filename, true);
+        segment.reset(openReadWrite(filename, true));
         break;
 
     case READ_WRITE:
-        openReadWrite(filename, false);
+        segment.reset(openReadWrite(filename, false));
         break;
 
     case READ_ONLY:
-        openReadOnly(filename);
+        segment.reset(openReadOnly(filename));
     }
 
-    current_mode_ = mode;
     current_filename_ = filename;
+    current_mode_ = mode;
+    mem_sgmt_.reset(segment.release());
 }
 
 void
@@ -309,30 +310,37 @@ void
 ZoneTableSegmentMapped::clear() {
     if (mem_sgmt_) {
         sync();
-        header_ = NULL;
         mem_sgmt_.reset();
     }
 }
 
-// After more methods' definitions are added here, it would be a good
-// idea to move getHeader() and getMemorySegment() definitions to the
-// header file.
-ZoneTableHeader&
-ZoneTableSegmentMapped::getHeader() {
+template<typename T>
+T*
+ZoneTableSegmentMapped::getHeaderHelper() const {
     if (!mem_sgmt_) {
         isc_throw(isc::InvalidOperation,
                   "getHeader() called without calling reset() first");
     }
-    return (*header_);
+
+    const MemorySegment::NamedAddressResult result =
+        mem_sgmt_->getNamedAddress(ZONE_TABLE_HEADER_NAME);
+    if (!result.first) {
+        isc_throw(isc::Unexpected,
+                  "Unable to look up the address of the table header in "
+                  "getHeader()");
+    }
+
+    return (static_cast<T*>(result.second));
+}
+
+ZoneTableHeader&
+ZoneTableSegmentMapped::getHeader() {
+    return (*getHeaderHelper<ZoneTableHeader>());
 }
 
 const ZoneTableHeader&
 ZoneTableSegmentMapped::getHeader() const {
-    if (!mem_sgmt_) {
-        isc_throw(isc::InvalidOperation,
-                  "getHeader() called without calling reset() first");
-    }
-    return (*header_);
+    return (*getHeaderHelper<const ZoneTableHeader>());
 }
 
 MemorySegment&
diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h
index 208070c..2d95dd6 100644
--- a/src/lib/datasrc/memory/zone_table_segment_mapped.h
+++ b/src/lib/datasrc/memory/zone_table_segment_mapped.h
@@ -115,8 +115,11 @@ private:
     bool processHeader(isc::util::MemorySegmentMapped& segment, bool create,
                        std::string& error_msg);
 
-    void openReadWrite(const std::string& filename, bool create);
-    void openReadOnly(const std::string& filename);
+    isc::util::MemorySegmentMapped* openReadWrite(const std::string& filename,
+                                                  bool create);
+    isc::util::MemorySegmentMapped* openReadOnly(const std::string& filename);
+
+    template<typename T> T* getHeaderHelper() const;
 
 private:
     isc::dns::RRClass rrclass_;
@@ -125,7 +128,6 @@ 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* header_;
 };
 
 } // namespace memory



More information about the bind10-changes mailing list