blob: 542b88c910ac3d64ead98c0f1ea64438c41cc51c [file] [log] [blame]
Alexander Afanasyev8566f452012-12-10 15:21:51 -08001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
21#ifndef NDN_CONTENT_STORE_WITH_STATS_H_
22#define NDN_CONTENT_STORE_WITH_STATS_H_
23
24#include "content-store-impl.h"
25
Alexander Afanasyev0c395372014-12-20 15:54:02 -080026#include "content-store-impl.hpp"
27
28#include "../../utils/trie/multi-policy.hpp"
29#include "custom-policies/lifetime-stats-policy.hpp"
Alexander Afanasyev8566f452012-12-10 15:21:51 -080030
31namespace ns3 {
32namespace ndn {
33namespace cs {
34
Alexander Afanasyev79206512013-07-27 16:49:12 -070035/**
36 * @ingroup ndn-cs
37 * @brief Special content store realization that provides ability to track stats of CS operations
38 */
Alexander Afanasyev8566f452012-12-10 15:21:51 -080039template<class Policy>
40class ContentStoreWithStats :
41 public ContentStoreImpl< ndnSIM::multi_policy_traits< boost::mpl::vector2< Policy, ndnSIM::lifetime_stats_policy_traits > > >
42{
43public:
44 typedef ContentStoreImpl< ndnSIM::multi_policy_traits< boost::mpl::vector2< Policy, ndnSIM::lifetime_stats_policy_traits > > > super;
45
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070046 typedef typename super::policy_container::template index<1>::type lifetime_stats_container;
47
Alexander Afanasyev8566f452012-12-10 15:21:51 -080048 ContentStoreWithStats ()
49 {
50 // connect traceback to the policy
51 super::getPolicy ().template get<1> ().set_traced_callback (&m_willRemoveEntry);
52 }
Alexander Afanasyev7456b702013-02-01 22:41:48 -080053
Alexander Afanasyev8566f452012-12-10 15:21:51 -080054 static TypeId
55 GetTypeId ();
Alexander Afanasyev7456b702013-02-01 22:41:48 -080056
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070057 virtual inline void
58 Print (std::ostream &os) const;
59
Alexander Afanasyev8566f452012-12-10 15:21:51 -080060private:
61 static LogComponent g_log; ///< @brief Logging variable
62
63 /// @brief trace of for entry removal: first parameter is pointer to the CS entry, second is how long entry was in the cache
Alexander Afanasyev7456b702013-02-01 22:41:48 -080064 TracedCallback< Ptr<const Entry>, Time > m_willRemoveEntry;
Alexander Afanasyev8566f452012-12-10 15:21:51 -080065};
66
67//////////////////////////////////////////
68////////// Implementation ////////////////
69//////////////////////////////////////////
70
71
72template<class Policy>
73LogComponent
74ContentStoreWithStats< Policy >::g_log = LogComponent (("ndn.cs.Stats." + Policy::GetName ()).c_str ());
75
76
77template<class Policy>
78TypeId
79ContentStoreWithStats< Policy >::GetTypeId ()
80{
81 static TypeId tid = TypeId (("ns3::ndn::cs::Stats::"+Policy::GetName ()).c_str ())
82 .SetGroupName ("Ndn")
83 .SetParent<super> ()
84 .template AddConstructor< ContentStoreWithStats< Policy > > ()
85
86 .AddTraceSource ("WillRemoveEntry", "Trace called just before content store entry will be removed",
87 MakeTraceSourceAccessor (&ContentStoreWithStats< Policy >::m_willRemoveEntry))
88
89 // trace stuff here
90 ;
91
92 return tid;
93}
94
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070095template<class Policy>
96void
97ContentStoreWithStats< Policy >::Print (std::ostream &os) const
98{
99 // const freshness_policy_container &freshness = this->getPolicy ().template get<freshness_policy_container> ();
100
101 for (typename super::policy_container::const_iterator item = this->getPolicy ().begin ();
102 item != this->getPolicy ().end ();
103 item++)
104 {
105 Time alive = lifetime_stats_container::policy_base::get_time (&(*item)) - Simulator::Now ();
106 os << item->payload ()->GetName () << "(alive: " << alive.ToDouble (Time::S) << "s)" << std::endl;
107 }
108}
109
110
Alexander Afanasyev8566f452012-12-10 15:21:51 -0800111
112} // namespace cs
113} // namespace ndn
114} // namespace ns3
115
116#endif // NDN_CONTENT_STORE_IMPL_H_