{
}
+ZoneTableSegmentMapped::~ZoneTableSegmentMapped() {
+ sync();
+}
+
bool
ZoneTableSegmentMapped::processChecksum(MemorySegmentMapped& segment,
bool create,
// mapped file. We cannot do this in many mode combinations
// unless we close the existing mapped file. So just close it.
clear();
+ } else {
+ sync();
}
switch (mode) {
current_filename_ = filename;
}
+void
+ZoneTableSegmentMapped::sync()
+{
+ // Synchronize checksum, etc.
+ if (mem_sgmt_ && isWritable()) {
+ // If there is a previously opened segment, and it was opened in
+ // read-write mode, update its checksum.
+ mem_sgmt_->shrinkToFit();
+ const MemorySegment::NamedAddressResult result =
+ mem_sgmt_->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
+ assert(result.first);
+ assert(result.second);
+ size_t* checksum = static_cast<size_t*>(result.second);
+ // First, clear the checksum so that getCheckSum() returns a
+ // consistent value.
+ *checksum = 0;
+ const size_t new_checksum = mem_sgmt_->getCheckSum();
+ // Now, update it into place.
+ *checksum = new_checksum;
+ }
+}
+
void
ZoneTableSegmentMapped::clear()
{
if (mem_sgmt_) {
- if (isWritable()) {
- // If there is a previously opened segment, and it was
- // opened in read-write mode, update its checksum.
- mem_sgmt_->shrinkToFit();
- const MemorySegment::NamedAddressResult result =
- mem_sgmt_->getNamedAddress(ZONE_TABLE_CHECKSUM_NAME);
- assert(result.first);
- assert(result.second);
- uint32_t* checksum = static_cast<uint32_t*>(result.second);
- // First, clear the checksum so that getCheckSum() returns
- // a consistent value.
- *checksum = 0;
- const uint32_t new_checksum = mem_sgmt_->getCheckSum();
- // Now, update it into place.
- *checksum = new_checksum;
- }
- // Close the segment here in case the code further below
- // doesn't complete successfully.
+ sync();
header_ = NULL;
mem_sgmt_.reset();
}
ZoneTableSegmentMapped(const isc::dns::RRClass& rrclass);
public:
+ /// \brief Destructor
+ virtual ~ZoneTableSegmentMapped();
+
/// \brief Return the ZoneTableHeader for the mapped zone table
/// segment implementation.
///
virtual void clear();
private:
+ void sync();
+
bool processChecksum(isc::util::MemorySegmentMapped& segment, bool create,
std::string& error_msg);
bool processHeader(isc::util::MemorySegmentMapped& segment, bool create,