blob: a9148914ed6ae07a553e63a2972f5a536c9a9dbe [file] [log] [blame]
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi30c37ab2018-04-09 14:26:47 +00002/*
3 * Copyright (c) 2014-2018, Regents of the University of California,
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -05004 * 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
Junxiao Shi30c37ab2018-04-09 14:26:47 +000026#ifndef NFD_DAEMON_TABLE_CS_POLICY_PRIORITY_FIFO_HPP
27#define NFD_DAEMON_TABLE_CS_POLICY_PRIORITY_FIFO_HPP
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050028
29#include "cs-policy.hpp"
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050030#include "core/scheduler.hpp"
31
Davide Pesaventoc0822fa2018-05-10 21:54:10 -040032#include <list>
33
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050034namespace nfd {
35namespace cs {
36namespace priority_fifo {
37
38typedef std::list<iterator> Queue;
39typedef Queue::iterator QueueIt;
40
41enum QueueType {
42 QUEUE_UNSOLICITED,
43 QUEUE_STALE,
44 QUEUE_FIFO,
45 QUEUE_MAX
46};
47
48struct EntryInfo
49{
50 QueueType queueType;
51 QueueIt queueIt;
52 scheduler::EventId moveStaleEventId;
53};
54
55struct EntryItComparator
56{
57 bool
58 operator()(const iterator& a, const iterator& b) const
59 {
60 return *a < *b;
61 }
62};
63
64typedef std::map<iterator, EntryInfo*, EntryItComparator> EntryInfoMapFifo;
65
Junxiao Shi30c37ab2018-04-09 14:26:47 +000066/** \brief Priority FIFO replacement policy
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050067 *
Junxiao Shi30c37ab2018-04-09 14:26:47 +000068 * This policy maintains a set of cleanup queues to decide the eviction order of CS entries.
69 * The cleanup queues are three doubly linked lists that store Table iterators.
70 * The three queues keep track of unsolicited, stale, and fresh Data packet, respectively.
71 * Table iterator is placed into, removed from, and moved between suitable queues
72 * whenever an Entry is added, removed, or has other attribute changes.
73 * The Table iterator of an Entry should be in exactly one queue at any moment.
74 * Within each queue, the iterators are kept in first-in-first-out order.
75 * Eviction procedure exhausts the first queue before moving onto the next queue,
76 * in the order of unsolicited, stale, and fresh queue.
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050077 */
78class PriorityFifoPolicy : public Policy
79{
80public:
81 PriorityFifoPolicy();
82
Minsheng Zhang9c903e02015-10-03 18:16:05 -050083 virtual
84 ~PriorityFifoPolicy();
85
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050086public:
87 static const std::string POLICY_NAME;
88
89private:
Junxiao Shi30c37ab2018-04-09 14:26:47 +000090 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020091 doAfterInsert(iterator i) override;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050092
Junxiao Shi30c37ab2018-04-09 14:26:47 +000093 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020094 doAfterRefresh(iterator i) override;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050095
Junxiao Shi30c37ab2018-04-09 14:26:47 +000096 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020097 doBeforeErase(iterator i) override;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050098
Junxiao Shi30c37ab2018-04-09 14:26:47 +000099 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200100 doBeforeUse(iterator i) override;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500101
Junxiao Shi30c37ab2018-04-09 14:26:47 +0000102 void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200103 evictEntries() override;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500104
105private:
106 /** \brief evicts one entry
107 * \pre CS is not empty
108 */
109 void
110 evictOne();
111
112 /** \brief attaches the entry to an appropriate queue
113 * \pre the entry is not in any queue
114 */
115 void
116 attachQueue(iterator i);
117
118 /** \brief detaches the entry from its current queue
119 * \post the entry is not in any queue
120 */
121 void
122 detachQueue(iterator i);
123
124 /** \brief moves an entry from FIFO queue to STALE queue
125 */
126 void
127 moveToStaleQueue(iterator i);
128
129private:
130 Queue m_queues[QUEUE_MAX];
131 EntryInfoMapFifo m_entryInfoMap;
132};
133
Davide Pesaventob84bd3a2016-04-22 02:21:45 +0200134} // namespace priority_fifo
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500135
136using priority_fifo::PriorityFifoPolicy;
137
138} // namespace cs
139} // namespace nfd
140
Junxiao Shi30c37ab2018-04-09 14:26:47 +0000141#endif // NFD_DAEMON_TABLE_CS_POLICY_PRIORITY_FIFO_HPP