cs-policy-lru.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014-2019, Regents of the University of California,
4  * Arizona Board of Regents,
5  * Colorado State University,
6  * University Pierre & Marie Curie, Sorbonne University,
7  * Washington University in St. Louis,
8  * Beijing Institute of Technology,
9  * The University of Memphis.
10  *
11  * This file is part of NFD (Named Data Networking Forwarding Daemon).
12  * See AUTHORS.md for complete list of NFD authors and contributors.
13  *
14  * NFD is free software: you can redistribute it and/or modify it under the terms
15  * of the GNU General Public License as published by the Free Software Foundation,
16  * either version 3 of the License, or (at your option) any later version.
17  *
18  * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20  * PURPOSE. See the GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License along with
23  * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24  */
25 
26 #include "cs-policy-lru.hpp"
27 #include "cs.hpp"
28 
29 namespace nfd {
30 namespace cs {
31 namespace lru {
32 
33 const std::string LruPolicy::POLICY_NAME = "lru";
35 
37  : Policy(POLICY_NAME)
38 {
39 }
40 
41 void
42 LruPolicy::doAfterInsert(EntryRef i)
43 {
44  this->insertToQueue(i, true);
45  this->evictEntries();
46 }
47 
48 void
49 LruPolicy::doAfterRefresh(EntryRef i)
50 {
51  this->insertToQueue(i, false);
52 }
53 
54 void
55 LruPolicy::doBeforeErase(EntryRef i)
56 {
57  m_queue.get<1>().erase(i);
58 }
59 
60 void
61 LruPolicy::doBeforeUse(EntryRef i)
62 {
63  this->insertToQueue(i, false);
64 }
65 
66 void
67 LruPolicy::evictEntries()
68 {
69  BOOST_ASSERT(this->getCs() != nullptr);
70  while (this->getCs()->size() > this->getLimit()) {
71  BOOST_ASSERT(!m_queue.empty());
72  EntryRef i = m_queue.front();
73  m_queue.pop_front();
74  this->emitSignal(beforeEvict, i);
75  }
76 }
77 
78 void
79 LruPolicy::insertToQueue(EntryRef i, bool isNewEntry)
80 {
81  Queue::iterator it;
82  bool isNew = false;
83  // push_back only if i does not exist
84  std::tie(it, isNew) = m_queue.push_back(i);
85 
86  BOOST_ASSERT(isNew == isNewEntry);
87  if (!isNewEntry) {
88  m_queue.relocate(m_queue.end(), it);
89  }
90 }
91 
92 } // namespace lru
93 } // namespace cs
94 } // namespace nfd
Cs * getCs() const
gets cs
Definition: cs-policy.hpp:77
size_t getLimit() const
gets hard limit (in number of entries)
Definition: cs-policy.hpp:93
#define NFD_REGISTER_CS_POLICY(P)
registers a CS policy
Definition: cs-policy.hpp:214
Least-Recently-Used (LRU) replacement policy.
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
Definition: algorithm.hpp:32
static const std::string POLICY_NAME
represents a CS replacement policy
Definition: cs-policy.hpp:38
Table::const_iterator EntryRef
a reference to an CS entry
Definition: cs-policy.hpp:111
signal::Signal< Policy, EntryRef > beforeEvict
emits when an entry is being evicted
Definition: cs-policy.hpp:118