#include <config.h>
#include <dhcpsrv/testutils/memory_host_data_source.h>
+#include <util/multi_threading_mgr.h>
#include <boost/foreach.hpp>
using namespace isc::db;
+using namespace isc::util;
using namespace std;
namespace isc {
const size_t identifier_len) const {
vector<uint8_t> ident(identifier_begin, identifier_begin + identifier_len);
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// If identifier type do not match, it's not for us
if (h->getIdentifierType() != identifier_type) {
ConstHostCollection
MemHostDataSource::getAll4(const SubnetID& subnet_id) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Keep it when subnet_id matches.
if (h->getIPv4SubnetID() == subnet_id) {
ConstHostCollection
MemHostDataSource::getAll6(const SubnetID& subnet_id) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Keep it when subnet_id matches.
if (h->getIPv6SubnetID() == subnet_id) {
ConstHostCollection
MemHostDataSource::getAllbyHostname(const std::string& hostname) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Keep it when hostname matches.
if (h->getLowerHostname() == hostname) {
MemHostDataSource::getAllbyHostname4(const std::string& hostname,
const SubnetID& subnet_id) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Keep it when hostname and subnet_id match.
if ((h->getLowerHostname() == hostname) &&
MemHostDataSource::getAllbyHostname6(const std::string& hostname,
const SubnetID& subnet_id) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Keep it when hostname and subnet_id match.
if ((h->getLowerHostname() == hostname) &&
uint64_t lower_host_id,
const HostPageSize& page_size) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Skip it when subnet_id does not match.
if (h->getIPv4SubnetID() != subnet_id) {
uint64_t lower_host_id,
const HostPageSize& page_size) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Skip it when subnet_id does not match.
if (h->getIPv6SubnetID() != subnet_id) {
uint64_t lower_host_id,
const HostPageSize& page_size) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (lower_host_id && (h->getHostId() <= lower_host_id)) {
continue;
uint64_t lower_host_id,
const HostPageSize& page_size) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (lower_host_id && (h->getHostId() <= lower_host_id)) {
continue;
ConstHostCollection
MemHostDataSource::getAll4(const asiolink::IOAddress& address) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (h->getIPv4Reservation() == address) {
hosts.push_back(h);
const uint8_t* identifier_begin,
const size_t identifier_len) const {
vector<uint8_t> ident(identifier_begin, identifier_begin + identifier_len);
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// If either subnet-id or identifier type do not match,
// it's not our host
const uint8_t* identifier_begin,
const size_t identifier_len) const {
vector<uint8_t> ident(identifier_begin, identifier_begin + identifier_len);
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// If either subnet-id or identifier type do not match,
// it's not our host
ConstHostPtr
MemHostDataSource::get4(const SubnetID& subnet_id,
const asiolink::IOAddress& address) const {
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (h->getIPv4SubnetID() == subnet_id &&
h->getIPv4Reservation() == address) {
MemHostDataSource::getAll4(const SubnetID& subnet_id,
const asiolink::IOAddress& address) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (h->getIPv4SubnetID() == subnet_id &&
h->getIPv4Reservation() == address) {
ConstHostPtr
MemHostDataSource::get6(const SubnetID& subnet_id,
const asiolink::IOAddress& address) const {
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
// Naive approach: check hosts one by one
MemHostDataSource::getAll6(const SubnetID& subnet_id,
const asiolink::IOAddress& address) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
if (h->getIPv6SubnetID() != subnet_id) {
continue;
ConstHostCollection
MemHostDataSource::getAll6(const asiolink::IOAddress& address) const {
ConstHostCollection hosts;
+ MultiThreadingLock lock(mutex_);
for (auto const& h : store_) {
auto const& resrvs = h->getIPv6Reservations();
BOOST_FOREACH(auto const& r, resrvs) {
void
MemHostDataSource::add(const HostPtr& host) {
+ MultiThreadingLock lock(mutex_);
host->setHostId(++next_host_id_);
store_.push_back(host);
}
bool
MemHostDataSource::del(const SubnetID& subnet_id,
const asiolink::IOAddress& addr) {
+ MultiThreadingLock lock(mutex_);
for (auto h = store_.begin(); h != store_.end(); ++h) {
if (addr.isV4()) {
if ((*h)->getIPv4SubnetID() == subnet_id &&
const uint8_t* identifier_begin,
const size_t identifier_len) {
vector<uint8_t> ident(identifier_begin, identifier_begin + identifier_len);
+ MultiThreadingLock lock(mutex_);
for (auto h = store_.begin(); h != store_.end(); ++h) {
// If either subnet-id or identifier type do not match,
// it's not our host
const uint8_t* identifier_begin,
const size_t identifier_len) {
vector<uint8_t> ident(identifier_begin, identifier_begin + identifier_len);
+ MultiThreadingLock lock(mutex_);
for (auto h = store_.begin(); h != store_.end(); ++h) {
// If either subnet-id or identifier type do not match,
// it's not our host
size_t
MemHostDataSource::size() const {
+ MultiThreadingLock lock(mutex_);
return (store_.size());
}