Skip to content

Commit

Permalink
table: NameTree::getEntry
Browse files Browse the repository at this point in the history
NameTree::get is renamed to NameTree::lookup.
NameTree::getEntry is introduced to return the NameTreeEntry on which a table entry is attached.
tableEntry::m_nameTreeEntry is changed to weak_ptr to avoid circular shared_ptr reference.

refs #3608, #3619

Change-Id: I425b6a2eb5fe3024bbaff4ff766eb6739be54b02
  • Loading branch information
yoursunny committed May 26, 2016
1 parent ff92030 commit b184e53
Show file tree
Hide file tree
Showing 12 changed files with 195 additions and 177 deletions.
18 changes: 9 additions & 9 deletions daemon/table/fib-entry.hpp
@@ -1,12 +1,12 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
Expand All @@ -33,7 +33,7 @@ namespace nfd {
class NameTree;
namespace name_tree {
class Entry;
}
} // namespace name_tree

namespace fib {

Expand Down Expand Up @@ -105,7 +105,7 @@ class Entry : noncopyable
Name m_prefix;
NextHopList m_nextHops;

shared_ptr<name_tree::Entry> m_nameTreeEntry;
weak_ptr<name_tree::Entry> m_nameTreeEntry;
friend class nfd::NameTree;
friend class nfd::name_tree::Entry;
};
Expand Down
29 changes: 16 additions & 13 deletions daemon/table/fib.cpp
Expand Up @@ -59,15 +59,15 @@ Fib::~Fib()
static inline bool
predicate_NameTreeEntry_hasFibEntry(const name_tree::Entry& entry)
{
return static_cast<bool>(entry.getFibEntry());
return entry.getFibEntry() != nullptr;
}

shared_ptr<fib::Entry>
Fib::findLongestPrefixMatch(const Name& prefix) const
{
shared_ptr<name_tree::Entry> nameTreeEntry =
m_nameTree.findLongestPrefixMatch(prefix, &predicate_NameTreeEntry_hasFibEntry);
if (static_cast<bool>(nameTreeEntry)) {
if (nameTreeEntry != nullptr) {
return nameTreeEntry->getFibEntry();
}
return s_emptyEntry;
Expand All @@ -77,13 +77,15 @@ shared_ptr<fib::Entry>
Fib::findLongestPrefixMatch(shared_ptr<name_tree::Entry> nameTreeEntry) const
{
shared_ptr<fib::Entry> entry = nameTreeEntry->getFibEntry();
if (static_cast<bool>(entry))
if (entry != nullptr)
return entry;

nameTreeEntry = m_nameTree.findLongestPrefixMatch(nameTreeEntry,
&predicate_NameTreeEntry_hasFibEntry);
if (static_cast<bool>(nameTreeEntry)) {
if (nameTreeEntry != nullptr) {
return nameTreeEntry->getFibEntry();
}

return s_emptyEntry;
}

Expand All @@ -98,9 +100,8 @@ Fib::findLongestPrefixMatch(const pit::Entry& pitEntry) const
shared_ptr<fib::Entry>
Fib::findLongestPrefixMatch(const measurements::Entry& measurementsEntry) const
{
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.get(measurementsEntry);

BOOST_ASSERT(static_cast<bool>(nameTreeEntry));
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.lookup(measurementsEntry);
BOOST_ASSERT(nameTreeEntry != nullptr);

return findLongestPrefixMatch(nameTreeEntry);
}
Expand All @@ -109,18 +110,20 @@ shared_ptr<fib::Entry>
Fib::findExactMatch(const Name& prefix) const
{
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.findExactMatch(prefix);
if (static_cast<bool>(nameTreeEntry))
if (nameTreeEntry != nullptr)
return nameTreeEntry->getFibEntry();
return shared_ptr<fib::Entry>();

return nullptr;
}

std::pair<shared_ptr<fib::Entry>, bool>
Fib::insert(const Name& prefix)
{
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.lookup(prefix);
shared_ptr<fib::Entry> entry = nameTreeEntry->getFibEntry();
if (static_cast<bool>(entry))
if (entry != nullptr)
return std::make_pair(entry, false);

entry = make_shared<fib::Entry>(prefix);
nameTreeEntry->setFibEntry(entry);
++m_nItems;
Expand All @@ -139,16 +142,16 @@ void
Fib::erase(const Name& prefix)
{
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.findExactMatch(prefix);
if (static_cast<bool>(nameTreeEntry)) {
if (nameTreeEntry != nullptr) {
this->erase(nameTreeEntry);
}
}

void
Fib::erase(const fib::Entry& entry)
{
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.get(entry);
if (static_cast<bool>(nameTreeEntry)) {
shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.lookup(entry);
if (nameTreeEntry != nullptr) {
this->erase(nameTreeEntry);
}
}
Expand Down
6 changes: 3 additions & 3 deletions daemon/table/measurements-entry.hpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2015, Regents of the University of California,
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
Expand Down Expand Up @@ -36,7 +36,7 @@ class NameTree;

namespace name_tree {
class Entry;
}
} // namespace name_tree

class Measurements;

Expand All @@ -60,7 +60,7 @@ class Entry : public StrategyInfoHost, noncopyable
private: // lifetime
time::steady_clock::TimePoint m_expiry;
scheduler::EventId m_cleanup;
shared_ptr<name_tree::Entry> m_nameTreeEntry;
weak_ptr<name_tree::Entry> m_nameTreeEntry;

friend class nfd::NameTree;
friend class nfd::name_tree::Entry;
Expand Down
23 changes: 11 additions & 12 deletions daemon/table/measurements.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2015, Regents of the University of California,
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
Expand Down Expand Up @@ -66,7 +66,7 @@ Measurements::get(const Name& name)
shared_ptr<Entry>
Measurements::get(const fib::Entry& fibEntry)
{
shared_ptr<name_tree::Entry> nte = m_nameTree.get(fibEntry);
shared_ptr<name_tree::Entry> nte = m_nameTree.lookup(fibEntry);
if (nte == nullptr) {
// must be Fib::s_emptyEntry that is unattched
BOOST_ASSERT(fibEntry.getPrefix().empty());
Expand All @@ -80,9 +80,9 @@ Measurements::get(const fib::Entry& fibEntry)
shared_ptr<Entry>
Measurements::get(const pit::Entry& pitEntry)
{
shared_ptr<name_tree::Entry> nte = m_nameTree.get(pitEntry);

shared_ptr<name_tree::Entry> nte = m_nameTree.lookup(pitEntry);
BOOST_ASSERT(nte != nullptr);

return this->get(*nte);
}

Expand All @@ -93,7 +93,7 @@ Measurements::getParent(const Entry& child)
return nullptr;
}

shared_ptr<name_tree::Entry> nteChild = m_nameTree.get(child);
shared_ptr<name_tree::Entry> nteChild = m_nameTree.lookup(child);
shared_ptr<name_tree::Entry> nte = nteChild->getParent();
BOOST_ASSERT(nte != nullptr);
return this->get(*nte);
Expand Down Expand Up @@ -126,7 +126,8 @@ shared_ptr<Entry>
Measurements::findLongestPrefixMatch(const pit::Entry& pitEntry,
const measurements::EntryPredicate& pred) const
{
shared_ptr<name_tree::Entry> nte = m_nameTree.get(pitEntry);
shared_ptr<name_tree::Entry> nte = m_nameTree.lookup(pitEntry);
BOOST_ASSERT(nte != nullptr);
return this->findLongestPrefixMatchImpl(nte, pred);
}

Expand All @@ -140,12 +141,10 @@ Measurements::findExactMatch(const Name& name) const
}

void
Measurements::extendLifetime(Entry& entry,
const time::nanoseconds& lifetime)
Measurements::extendLifetime(Entry& entry, const time::nanoseconds& lifetime)
{
shared_ptr<name_tree::Entry> nte = m_nameTree.get(entry);
if (nte == nullptr ||
nte->getMeasurementsEntry().get() != &entry) {
shared_ptr<name_tree::Entry> nte = m_nameTree.lookup(entry);
if (nte == nullptr || nte->getMeasurementsEntry().get() != &entry) {
// entry is already gone; it is a dangling reference
return;
}
Expand All @@ -164,7 +163,7 @@ Measurements::extendLifetime(Entry& entry,
void
Measurements::cleanup(Entry& entry)
{
shared_ptr<name_tree::Entry> nte = m_nameTree.get(entry);
shared_ptr<name_tree::Entry> nte = m_nameTree.lookup(entry);
if (nte != nullptr) {
nte->setMeasurementsEntry(nullptr);
m_nameTree.eraseEntryIfEmpty(nte);
Expand Down
58 changes: 27 additions & 31 deletions daemon/table/name-tree-entry.cpp
@@ -1,12 +1,12 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
Expand Down Expand Up @@ -58,33 +58,32 @@ bool
Entry::isEmpty() const
{
return m_children.empty() &&
!static_cast<bool>(m_fibEntry) &&
m_fibEntry == nullptr &&
m_pitEntries.empty() &&
!static_cast<bool>(m_measurementsEntry) &&
!static_cast<bool>(m_strategyChoiceEntry);
m_measurementsEntry == nullptr &&
m_strategyChoiceEntry == nullptr;
}

void
Entry::setFibEntry(shared_ptr<fib::Entry> fibEntry)
{
if (static_cast<bool>(fibEntry)) {
BOOST_ASSERT(!static_cast<bool>(fibEntry->m_nameTreeEntry));
}
BOOST_ASSERT(fibEntry == nullptr || fibEntry->m_nameTreeEntry.expired());

if (static_cast<bool>(m_fibEntry)) {
if (m_fibEntry != nullptr) {
m_fibEntry->m_nameTreeEntry.reset();
}
m_fibEntry = fibEntry;
if (static_cast<bool>(m_fibEntry)) {

if (m_fibEntry != nullptr) {
m_fibEntry->m_nameTreeEntry = this->shared_from_this();
}
}

void
Entry::insertPitEntry(shared_ptr<pit::Entry> pitEntry)
{
BOOST_ASSERT(static_cast<bool>(pitEntry));
BOOST_ASSERT(!static_cast<bool>(pitEntry->m_nameTreeEntry));
BOOST_ASSERT(pitEntry != nullptr);
BOOST_ASSERT(pitEntry->m_nameTreeEntry.expired());

m_pitEntries.push_back(pitEntry);
pitEntry->m_nameTreeEntry = this->shared_from_this();
Expand All @@ -93,11 +92,10 @@ Entry::insertPitEntry(shared_ptr<pit::Entry> pitEntry)
void
Entry::erasePitEntry(shared_ptr<pit::Entry> pitEntry)
{
BOOST_ASSERT(static_cast<bool>(pitEntry));
BOOST_ASSERT(pitEntry->m_nameTreeEntry.get() == this);
BOOST_ASSERT(pitEntry != nullptr);
BOOST_ASSERT(pitEntry->m_nameTreeEntry.lock().get() == this);

std::vector<shared_ptr<pit::Entry> >::iterator it =
std::find(m_pitEntries.begin(), m_pitEntries.end(), pitEntry);
auto it = std::find(m_pitEntries.begin(), m_pitEntries.end(), pitEntry);
BOOST_ASSERT(it != m_pitEntries.end());

*it = m_pitEntries.back();
Expand All @@ -108,31 +106,29 @@ Entry::erasePitEntry(shared_ptr<pit::Entry> pitEntry)
void
Entry::setMeasurementsEntry(shared_ptr<measurements::Entry> measurementsEntry)
{
if (static_cast<bool>(measurementsEntry)) {
BOOST_ASSERT(!static_cast<bool>(measurementsEntry->m_nameTreeEntry));
}
BOOST_ASSERT(measurementsEntry == nullptr || measurementsEntry->m_nameTreeEntry.expired());

if (static_cast<bool>(m_measurementsEntry)) {
if (m_measurementsEntry != nullptr) {
m_measurementsEntry->m_nameTreeEntry.reset();
}
m_measurementsEntry = measurementsEntry;
if (static_cast<bool>(m_measurementsEntry)) {

if (m_measurementsEntry != nullptr) {
m_measurementsEntry->m_nameTreeEntry = this->shared_from_this();
}
}

void
Entry::setStrategyChoiceEntry(shared_ptr<strategy_choice::Entry> strategyChoiceEntry)
{
if (static_cast<bool>(strategyChoiceEntry)) {
BOOST_ASSERT(!static_cast<bool>(strategyChoiceEntry->m_nameTreeEntry));
}
BOOST_ASSERT(strategyChoiceEntry == nullptr || strategyChoiceEntry->m_nameTreeEntry.expired());

if (static_cast<bool>(m_strategyChoiceEntry)) {
if (m_strategyChoiceEntry != nullptr) {
m_strategyChoiceEntry->m_nameTreeEntry.reset();
}

m_strategyChoiceEntry = strategyChoiceEntry;
if (static_cast<bool>(m_strategyChoiceEntry)) {
if (m_strategyChoiceEntry != nullptr) {
m_strategyChoiceEntry->m_nameTreeEntry = this->shared_from_this();
}
}
Expand Down
18 changes: 9 additions & 9 deletions daemon/table/name-tree-entry.hpp
@@ -1,12 +1,12 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
Expand Down Expand Up @@ -110,7 +110,7 @@ class Entry : public enable_shared_from_this<Entry>, noncopyable
bool
hasPitEntries() const;

const std::vector<shared_ptr<pit::Entry> >&
const std::vector<shared_ptr<pit::Entry>>&
getPitEntries() const;

void
Expand Down Expand Up @@ -199,7 +199,7 @@ Entry::hasPitEntries() const
return !m_pitEntries.empty();
}

inline const std::vector<shared_ptr<pit::Entry> >&
inline const std::vector<shared_ptr<pit::Entry>>&
Entry::getPitEntries() const
{
return m_pitEntries;
Expand Down

0 comments on commit b184e53

Please sign in to comment.