using namespace isc::dns;
using namespace isc::dns::rdata;
using namespace isc::datasrc::memory;
+using namespace isc::util;
namespace isc {
namespace datasrc {
namespace memory {
using detail::SegmentObjectHolder;
+using boost::shared_ptr;
namespace { // unnamed namespace
} // end of unnamed namespace
-InMemoryClient::InMemoryClient(util::MemorySegment& mem_sgmt,
+InMemoryClient::InMemoryClient(shared_ptr<ZoneTableSegment> zone_table_segment,
RRClass rrclass) :
- mem_sgmt_(mem_sgmt),
+ zone_table_segment_(zone_table_segment),
rrclass_(rrclass),
- zone_count_(0)
+ zone_count_(0),
+ file_name_tree_(FileNameTree::create(
+ zone_table_segment_->getMemorySegment(), false))
{
- SegmentObjectHolder<ZoneTable, RRClass> holder(
- mem_sgmt_, ZoneTable::create(mem_sgmt_, rrclass), rrclass_);
-
- file_name_tree_ = FileNameTree::create(mem_sgmt_, false);
-
- zone_table_ = holder.release();
}
InMemoryClient::~InMemoryClient() {
+ MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment();
FileNameDeleter deleter;
- FileNameTree::destroy(mem_sgmt_, file_name_tree_, deleter);
-
- ZoneTable::destroy(mem_sgmt_, zone_table_, rrclass_);
+ FileNameTree::destroy(mem_sgmt, file_name_tree_, deleter);
}
result::Result
const std::string& filename,
ZoneData* zone_data)
{
+ MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment();
SegmentObjectHolder<ZoneData, RRClass> holder(
- mem_sgmt_, zone_data, rrclass_);
+ mem_sgmt, zone_data, rrclass_);
LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEMORY_MEM_ADD_ZONE).
arg(zone_name).arg(rrclass_);
// Set the filename in file_name_tree_ now, so that getFileName()
// can use it (during zone reloading).
FileNameNode* node(NULL);
- switch (file_name_tree_->insert(mem_sgmt_, zone_name, &node)) {
+ switch (file_name_tree_->insert(mem_sgmt, zone_name, &node)) {
case FileNameTree::SUCCESS:
case FileNameTree::ALREADYEXISTS:
// These are OK
const std::string* tstr = node->setData(new std::string(filename));
delete tstr;
- const ZoneTable::AddResult result(zone_table_->addZone(mem_sgmt_, rrclass_,
- zone_name,
- holder.release()));
+ ZoneTable* zone_table = zone_table_segment_->getHeader().getTable();
+ const ZoneTable::AddResult result(zone_table->addZone(mem_sgmt, rrclass_,
+ zone_name,
+ holder.release()));
if (result.code == result::SUCCESS) {
// Only increment the zone count if the zone doesn't already
// exist.
}
// Destroy the old instance of the zone if there was any
if (result.zone_data != NULL) {
- ZoneData::destroy(mem_sgmt_, result.zone_data, rrclass_);
+ ZoneData::destroy(mem_sgmt, result.zone_data, rrclass_);
}
return (result.code);
LOG_DEBUG(logger, DBG_TRACE_DATA,
DATASRC_MEMORY_MEM_FIND_ZONE).arg(zone_name);
- ZoneTable::FindResult result(zone_table_->findZone(zone_name));
+ const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable();
+ ZoneTable::FindResult result(zone_table->findZone(zone_name));
ZoneFinderPtr finder;
if (result.code != result::NOTFOUND) {
const ZoneData*
InMemoryClient::findZoneData(const isc::dns::Name& zone_name) {
- ZoneTable::FindResult result(zone_table_->findZone(zone_name));
+ const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable();
+ ZoneTable::FindResult result(zone_table->findZone(zone_name));
return (result.zone_data);
}
LOG_DEBUG(logger, DBG_TRACE_BASIC, DATASRC_MEMORY_MEM_LOAD).arg(zone_name).
arg(filename);
- ZoneData* zone_data = loadZoneData(mem_sgmt_, rrclass_, zone_name,
+ MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment();
+ ZoneData* zone_data = loadZoneData(mem_sgmt, rrclass_, zone_name,
filename);
return (loadInternal(zone_name, filename, zone_data));
}
result::Result
InMemoryClient::load(const isc::dns::Name& zone_name, ZoneIterator& iterator) {
- ZoneData* zone_data = loadZoneData(mem_sgmt_, rrclass_, zone_name,
+ MemorySegment& mem_sgmt = zone_table_segment_->getMemorySegment();
+ ZoneData* zone_data = loadZoneData(mem_sgmt, rrclass_, zone_name,
iterator);
return (loadInternal(zone_name, string(), zone_data));
}
ZoneIteratorPtr
InMemoryClient::getIterator(const Name& name, bool separate_rrs) const {
- ZoneTable::FindResult result(zone_table_->findZone(name));
+ const ZoneTable* zone_table = zone_table_segment_->getHeader().getTable();
+ ZoneTable::FindResult result(zone_table->findZone(name));
if (result.code != result::SUCCESS) {
isc_throw(DataSourceError, "No such zone: " + name.toText());
}
#include <datasrc/iterator.h>
#include <datasrc/client.h>
#include <datasrc/memory/zone_table.h>
+#include <datasrc/memory/zone_table_segment.h>
#include <datasrc/memory/zone_data.h>
+#include <boost/shared_ptr.hpp>
+
#include <string>
namespace isc {
/// This constructor internally involves resource allocation, and if
/// it fails, a corresponding standard exception will be thrown.
/// It never throws an exception otherwise.
- InMemoryClient(util::MemorySegment& mem_sgmt,
+ InMemoryClient(boost::shared_ptr<ZoneTableSegment> zone_table_segment,
isc::dns::RRClass rrclass);
/// The destructor.
const std::string& filename,
ZoneData* zone_data);
- util::MemorySegment& mem_sgmt_;
+ boost::shared_ptr<ZoneTableSegment> zone_table_segment_;
const isc::dns::RRClass rrclass_;
unsigned int zone_count_;
- ZoneTable* zone_table_;
FileNameTree* file_name_tree_;
};
#include <testutils/dnsmessage_test.h>
#include "memory_segment_test.h"
+#include "zone_table_segment_test.h"
#include <gtest/gtest.h>
+#include <boost/shared_ptr.hpp>
+
#include <new> // for bad_alloc
+using namespace isc::data;
using namespace isc::dns;
using namespace isc::dns::rdata;
using namespace isc::datasrc;
using namespace isc::datasrc::memory;
using namespace isc::testutils;
+using boost::shared_ptr;
using std::vector;
namespace {
class MemoryClientTest : public ::testing::Test {
protected:
MemoryClientTest() : zclass_(RRClass::IN()),
- client_(new InMemoryClient(mem_sgmt_, zclass_))
+ segment_(new test::ZoneTableSegmentTest(
+ zclass_, mem_sgmt_)),
+ client_(new InMemoryClient(segment_, zclass_))
{}
~MemoryClientTest() {
- if (client_ != NULL) {
- delete client_;
- }
+ delete client_;
}
void TearDown() {
delete client_;
client_ = NULL;
+ segment_.reset();
EXPECT_TRUE(mem_sgmt_.allMemoryDeallocated()); // catch any leak here.
}
const RRClass zclass_;
test::MemorySegmentTest mem_sgmt_;
+ shared_ptr<ZoneTableSegment> segment_;
InMemoryClient* client_;
};
SCOPED_TRACE("For throw count = " + i);
mem_sgmt_.setThrowCount(i);
EXPECT_THROW({
+ shared_ptr<ZoneTableSegment> ztable_segment(
+ new test::ZoneTableSegmentTest(
+ zclass_, mem_sgmt_));
+
// Include the InMemoryClient construction too here. Now,
// even allocations done from InMemoryClient constructor
// fail (due to MemorySegmentTest throwing) and we check for
// leaks when this happens.
- InMemoryClient client2(mem_sgmt_, zclass_);
+ InMemoryClient client2(ztable_segment, zclass_);
client2.load(Name("example.org"),
TEST_DATA_DIR "/example.org.zone");
}, std::bad_alloc);