blob: a3f5fddabfca6252925cd686c884c1ba814dfd58 [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
26#include "../../utils/trie/multi-policy.h"
Alexander Afanasyev7456b702013-02-01 22:41:48 -080027#include "custom-policies/lifetime-stats-policy.h"
Alexander Afanasyev8566f452012-12-10 15:21:51 -080028
29namespace ns3 {
30namespace ndn {
31namespace cs {
32
Alexander Afanasyev79206512013-07-27 16:49:12 -070033/**
34 * @ingroup ndn-cs
35 * @brief Special content store realization that provides ability to track stats of CS operations
36 */
Alexander Afanasyev8566f452012-12-10 15:21:51 -080037template<class Policy>
38class ContentStoreWithStats :
39 public ContentStoreImpl< ndnSIM::multi_policy_traits< boost::mpl::vector2< Policy, ndnSIM::lifetime_stats_policy_traits > > >
40{
41public:
42 typedef ContentStoreImpl< ndnSIM::multi_policy_traits< boost::mpl::vector2< Policy, ndnSIM::lifetime_stats_policy_traits > > > super;
43
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070044 typedef typename super::policy_container::template index<1>::type lifetime_stats_container;
45
Alexander Afanasyev8566f452012-12-10 15:21:51 -080046 ContentStoreWithStats ()
47 {
48 // connect traceback to the policy
49 super::getPolicy ().template get<1> ().set_traced_callback (&m_willRemoveEntry);
50 }
Alexander Afanasyev7456b702013-02-01 22:41:48 -080051
Alexander Afanasyev8566f452012-12-10 15:21:51 -080052 static TypeId
53 GetTypeId ();
Alexander Afanasyev7456b702013-02-01 22:41:48 -080054
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070055 virtual inline void
56 Print (std::ostream &os) const;
57
Alexander Afanasyev8566f452012-12-10 15:21:51 -080058private:
59 static LogComponent g_log; ///< @brief Logging variable
60
61 /// @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 -080062 TracedCallback< Ptr<const Entry>, Time > m_willRemoveEntry;
Alexander Afanasyev8566f452012-12-10 15:21:51 -080063};
64
65//////////////////////////////////////////
66////////// Implementation ////////////////
67//////////////////////////////////////////
68
69
70template<class Policy>
71LogComponent
72ContentStoreWithStats< Policy >::g_log = LogComponent (("ndn.cs.Stats." + Policy::GetName ()).c_str ());
73
74
75template<class Policy>
76TypeId
77ContentStoreWithStats< Policy >::GetTypeId ()
78{
79 static TypeId tid = TypeId (("ns3::ndn::cs::Stats::"+Policy::GetName ()).c_str ())
80 .SetGroupName ("Ndn")
81 .SetParent<super> ()
82 .template AddConstructor< ContentStoreWithStats< Policy > > ()
83
84 .AddTraceSource ("WillRemoveEntry", "Trace called just before content store entry will be removed",
85 MakeTraceSourceAccessor (&ContentStoreWithStats< Policy >::m_willRemoveEntry))
86
87 // trace stuff here
88 ;
89
90 return tid;
91}
92
Alexander Afanasyevbe82da52013-04-09 05:43:14 -070093template<class Policy>
94void
95ContentStoreWithStats< Policy >::Print (std::ostream &os) const
96{
97 // const freshness_policy_container &freshness = this->getPolicy ().template get<freshness_policy_container> ();
98
99 for (typename super::policy_container::const_iterator item = this->getPolicy ().begin ();
100 item != this->getPolicy ().end ();
101 item++)
102 {
103 Time alive = lifetime_stats_container::policy_base::get_time (&(*item)) - Simulator::Now ();
104 os << item->payload ()->GetName () << "(alive: " << alive.ToDouble (Time::S) << "s)" << std::endl;
105 }
106}
107
108
Alexander Afanasyev8566f452012-12-10 15:21:51 -0800109
110} // namespace cs
111} // namespace ndn
112} // namespace ns3
113
114#endif // NDN_CONTENT_STORE_IMPL_H_