BIND 10 trac2850_4, updated. 1ee8b5efc468540d5542b300bb01bd0ae50fb339 [2850] Handle MemorySegmentGrown when creating the segment object holder

BIND 10 source code commits bind10-changes at lists.isc.org
Mon Jun 3 06:04:25 UTC 2013


The branch, trac2850_4 has been updated
       via  1ee8b5efc468540d5542b300bb01bd0ae50fb339 (commit)
       via  67b935d7e7bfd22d0b7341c8e81908c9b5dd19d3 (commit)
      from  127d2f3f9faeebcde23f77f64336e7551af525dc (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 1ee8b5efc468540d5542b300bb01bd0ae50fb339
Author: JINMEI Tatuya <jinmei at isc.org>
Date:   Mon Jun 3 11:13:21 2013 +0530

    [2850] Handle MemorySegmentGrown when creating the segment object holder

commit 67b935d7e7bfd22d0b7341c8e81908c9b5dd19d3
Author: JINMEI Tatuya <jinmei at isc.org>
Date:   Mon Jun 3 11:11:43 2013 +0530

    [2850] Assert that the segment is not grown during allMemoryDeallocated()

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

Summary of changes:
 src/lib/datasrc/memory/zone_writer.cc |   26 ++++++++++++++++++--------
 src/lib/util/memory_segment_mapped.cc |    7 ++++---
 2 files changed, 22 insertions(+), 11 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/lib/datasrc/memory/zone_writer.cc b/src/lib/datasrc/memory/zone_writer.cc
index d76fe3f..22cc26c 100644
--- a/src/lib/datasrc/memory/zone_writer.cc
+++ b/src/lib/datasrc/memory/zone_writer.cc
@@ -17,6 +17,8 @@
 #include <datasrc/memory/zone_table_segment.h>
 #include <datasrc/memory/segment_object_holder.h>
 
+#include <boost/scoped_ptr.hpp>
+
 #include <dns/rrclass.h>
 
 #include <memory>
@@ -45,9 +47,16 @@ struct ZoneWriter::Impl {
         load_action_(load_action),
         origin_(origin),
         rrclass_(rrclass),
-        state_(ZW_UNUSED),
-        data_holder_(segment.getMemorySegment(), rrclass_)
-    {}
+        state_(ZW_UNUSED)
+    {
+        while (true) {
+            try {
+                data_holder_.reset(
+                    new ZoneDataHolder(segment.getMemorySegment(), rrclass_));
+                break;
+            } catch (const isc::util::MemorySegmentGrown&) {}
+        }
+    }
 
     ZoneTableSegment& segment_;
     const LoadAction load_action_;
@@ -60,7 +69,8 @@ struct ZoneWriter::Impl {
         ZW_CLEANED
     };
     State state_;
-    detail::SegmentObjectHolder<ZoneData, dns::RRClass> data_holder_;
+    typedef detail::SegmentObjectHolder<ZoneData, dns::RRClass> ZoneDataHolder;
+    boost::scoped_ptr<ZoneDataHolder> data_holder_;
 };
 
 ZoneWriter::ZoneWriter(ZoneTableSegment& segment,
@@ -90,7 +100,7 @@ ZoneWriter::load() {
         // Bug inside load_action_.
         isc_throw(isc::InvalidOperation, "No data returned from load action");
     }
-    impl_->data_holder_.set(zone_data);
+    impl_->data_holder_->set(zone_data);
 
     impl_->state_ = Impl::ZW_LOADED;
 }
@@ -118,8 +128,8 @@ ZoneWriter::install() {
             const ZoneTable::AddResult result(
                 table->addZone(impl_->segment_.getMemorySegment(),
                                impl_->rrclass_, impl_->origin_,
-                               impl_->data_holder_.get()));
-            impl_->data_holder_.set(result.zone_data);
+                               impl_->data_holder_->get()));
+            impl_->data_holder_->set(result.zone_data);
             impl_->state_ = Impl::ZW_INSTALLED;
         } catch (const isc::util::MemorySegmentGrown&) {}
     }
@@ -129,7 +139,7 @@ void
 ZoneWriter::cleanup() {
     // We eat the data (if any) now.
 
-    ZoneData* zone_data = impl_->data_holder_.release();
+    ZoneData* zone_data = impl_->data_holder_->release();
     if (zone_data) {
         ZoneData::destroy(impl_->segment_.getMemorySegment(), zone_data,
                           impl_->rrclass_);
diff --git a/src/lib/util/memory_segment_mapped.cc b/src/lib/util/memory_segment_mapped.cc
index f36ad71..9300cae 100644
--- a/src/lib/util/memory_segment_mapped.cc
+++ b/src/lib/util/memory_segment_mapped.cc
@@ -137,7 +137,7 @@ struct MemorySegmentMapped::Impl {
         reserveMemory();
     }
 
-    void reserveMemory() {
+    void reserveMemory(bool no_grow = false) {
         if (!read_only_) {
             // Reserve a named address for use during
             // setNamedAddress(). Though this will almost always succeed
@@ -153,6 +153,7 @@ struct MemorySegmentMapped::Impl {
                 if (reserved_storage) {
                     break;
                 }
+                assert(!no_grow);
 
                 growSegment();
             }
@@ -332,8 +333,8 @@ MemorySegmentMapped::allMemoryDeallocated() const {
         impl_->freeReservedMemory();
         const bool result = impl_->base_sgmt_->all_memory_deallocated();
         // reserveMemory() should succeed now as the memory was already
-        // allocated.
-        impl_->reserveMemory();
+        // allocated, so we set no_grow to true.
+        impl_->reserveMemory(true);
         return (result);
     } catch (...) {
         abort();



More information about the bind10-changes mailing list