diff --git a/examples/simple-point-to-point.cc b/examples/simple-point-to-point.cc index 4e7657cdb..91a1f45e1 100644 --- a/examples/simple-point-to-point.cc +++ b/examples/simple-point-to-point.cc @@ -64,6 +64,7 @@ #include "ns3/ipv4-route.h" #include "ns3/point-to-point-topology.h" #include "ns3/onoff-application.h" +#include "ns3/node-list.h" using namespace ns3; @@ -178,6 +179,8 @@ int main (int argc, char *argv[]) asciitrace.TraceAllQueues (); asciitrace.TraceAllNetDeviceRx (); + NodeList::ConnectPrinterToAll (std::cout); + // Also configure some tcpdump traces; each interface will be traced // The output files will be named // simple-point-to-point.pcap-- diff --git a/src/core/array-trace-resolver.h b/src/core/array-trace-resolver.h index 0d1086447..d5bc2ca32 100644 --- a/src/core/array-trace-resolver.h +++ b/src/core/array-trace-resolver.h @@ -64,6 +64,7 @@ public: virtual void Disconnect (std::string path, CallbackBase const &cb); virtual void CollectSources (std::string path, const TraceContext &context, SourceCollection *collection); + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context); private: class IteratorBase @@ -183,6 +184,21 @@ ArrayTraceResolver::CollectSources (std::string path, const TraceContext } } +template +void +ArrayTraceResolver::ConnectPrinterToAll (std::ostream &os, const TraceContext &context) +{ + uint32_t j = 0; + for (m_iter->Rewind (); m_iter->HasNext (); m_iter->Next ()) + { + TraceContext tmp = context; + INDEX index = j; + tmp.AddElement (index); + Ptr obj = m_iter->Get (); + obj->GetTraceResolver ()->ConnectPrinterToAll (os, tmp); + j++; + } +} }//namespace ns3 diff --git a/src/core/callback-trace-source.cc b/src/core/callback-trace-source.cc index aa686c14d..02298520e 100644 --- a/src/core/callback-trace-source.cc +++ b/src/core/callback-trace-source.cc @@ -19,6 +19,9 @@ * Author: Mathieu Lacage */ #include "callback-trace-source.h" + +#ifdef RUN_SELF_TESTS + #include "test.h" namespace ns3 { @@ -93,6 +96,6 @@ CallbackTraceSourceTest::RunTests (void) CallbackTraceSourceTest g_callbackTraceTest; - - }//namespace ns3 + +#endif /* RUN_SELF_TESTS */ diff --git a/src/core/callback-trace-source.h b/src/core/callback-trace-source.h index d571b5739..2e302cdc2 100644 --- a/src/core/callback-trace-source.h +++ b/src/core/callback-trace-source.h @@ -44,6 +44,7 @@ public: CallbackTraceSource (); virtual void AddCallback (CallbackBase const & callback, TraceContext const & context); virtual void RemoveCallback (CallbackBase const & callback); + virtual void ConnectPrinter (std::ostream &os, const TraceContext &context); void operator() (void) const; void operator() (T1 a1) const; void operator() (T1 a1, T2 a2) const; @@ -62,6 +63,92 @@ private: namespace ns3 { +namespace internal { + +template +class TraceSinkPrint; + +template +class TraceSinkPrint +{ +public: + static Callback Make (std::ostream &os) + { + return ns3::MakeBoundCallback (&DoPrint, &os); + } +private: + static void DoPrint (std::ostream *os, const TraceContext &context, T1 a1, T2 a2, T3 a3, T4 a4) + { + *os << "context=\"" << context << "\" arg1=\"" << a1 << "\" arg2=\"" << a2 << "\" arg3=\"" << a3 << "\" arg4=\"" << a4 << "\"" << std::endl; + } +}; + +template +class TraceSinkPrint +{ +public: + static Callback Make (std::ostream &os) + { + return ns3::MakeBoundCallback (&DoPrint, &os); + } +private: + static void DoPrint (std::ostream *os, const TraceContext &context, T1 a1, T2 a2, T3 a3) + { + *os << "context=\"" << context << "\" arg1=\"" << a1 << "\" arg2=\"" << a2 << "\" arg3=\"" << a3 << "\"" << std::endl; + } +}; + +template +class TraceSinkPrint +{ +public: + static Callback Make (std::ostream &os) + { + return ns3::MakeBoundCallback (&DoPrint, &os); + } +private: + static void DoPrint (std::ostream *os, const TraceContext &context, T1 a1, T2 a2) + { + *os << "context=\"" << context << "\" arg1=\"" << a1 << "\" arg2=\"" << a2 << "\"" << std::endl; + } +}; + +template +class TraceSinkPrint +{ +public: + static Callback Make (std::ostream &os) + { + return ns3::MakeBoundCallback (&DoPrint, &os); + } +private: + static void DoPrint (std::ostream *os, const TraceContext &context, T1 a1) + { + *os << "context=\"" << context << "\" arg1=\"" << a1 << "\"" << std::endl; + } +}; + +template <> +class TraceSinkPrint +{ +public: + static Callback Make (std::ostream &os) + { + return ns3::MakeBoundCallback (&DoPrint, &os); + } +private: + static void DoPrint (std::ostream *os, const TraceContext &context) + { + *os << "context=\"" << context << std::endl; + } +}; + +} // namespace internal + + template CallbackTraceSource::CallbackTraceSource () @@ -99,6 +186,13 @@ CallbackTraceSource::RemoveCallback (CallbackBase const & callback) template void +CallbackTraceSource::ConnectPrinter (std::ostream &os, const TraceContext &context) +{ + AddCallback (ns3::internal::TraceSinkPrint::Make (os), context); +} +template +void CallbackTraceSource::operator() (void) const { for (typename CallbackList::const_iterator i = m_callbackList.begin (); diff --git a/src/core/composite-trace-resolver.cc b/src/core/composite-trace-resolver.cc index bb0aacabb..377da45b5 100644 --- a/src/core/composite-trace-resolver.cc +++ b/src/core/composite-trace-resolver.cc @@ -63,6 +63,12 @@ CompositeTraceResolver::Add (std::string name, ctx.Union (this->context); this->maker ()->CollectSources (path, ctx, collection); } + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) + { + TraceContext ctx = context; + ctx.Union (this->context); + this->maker ()->ConnectPrinterToAll (os, ctx); + } Callback > maker; } *item = new MakerResolveItem (); item->name = name; @@ -101,6 +107,12 @@ CompositeTraceResolver::DoAddSource (std::string name, ctx.Union (this->context); collection->AddUnique (path, ctx, this->doc); } + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) + { + TraceContext ctx = context; + ctx.Union (this->context); + this->trace->ConnectPrinter (os, ctx); + } TraceSource *trace; TraceDoc doc; } *item = new SourceResolveItem (); @@ -138,6 +150,12 @@ CompositeTraceResolver::DoAddComposite (std::string name, Ptr composite, ctx.Union (this->context); this->composite->GetTraceResolver ()->CollectSources (path, ctx, collection); } + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) + { + TraceContext ctx = context; + ctx.Union (this->context); + this->composite->GetTraceResolver ()->ConnectPrinterToAll (os, ctx); + } Ptr composite; } *item = new CompositeResolveItem (); @@ -293,6 +311,19 @@ CompositeTraceResolver::CollectSources (std::string path, const TraceContext &co m_parent->CollectSources (path, context, collection); } } +void +CompositeTraceResolver::ConnectPrinterToAll (std::ostream &os, const TraceContext &context) +{ + for (TraceItems::const_iterator i = m_items.begin (); i != m_items.end (); i++) + { + NS_DEBUG ("print " << (*i)->name); + (*i)->ConnectPrinterToAll (os, context); + } + if (m_parent != 0) + { + m_parent->ConnectPrinterToAll (os, context); + } +} }//namespace ns3 diff --git a/src/core/composite-trace-resolver.h b/src/core/composite-trace-resolver.h index 56886d739..c0612151f 100644 --- a/src/core/composite-trace-resolver.h +++ b/src/core/composite-trace-resolver.h @@ -120,6 +120,7 @@ private: virtual void Disconnect (std::string path, CallbackBase const &cb); virtual void CollectSources (std::string path, const TraceContext &context, SourceCollection *collection); + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context); friend class CompositeTraceResolverTest; class ResolveItem { @@ -129,6 +130,7 @@ private: virtual void Disconnect (std::string subpath, const CallbackBase &cb) = 0; virtual void CollectSources (std::string path, const TraceContext &context, SourceCollection *collection) = 0; + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) = 0; std::string name; TraceContext context; @@ -199,6 +201,12 @@ CompositeTraceResolver::AddArray (std::string name, ctx.Union (this->context); array->CollectSources (path, ctx, collection); } + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) + { + TraceContext ctx = context; + ctx.Union (this->context); + array->ConnectPrinterToAll (os, ctx); + } Ptr > array; } *item = new ArrayResolveItem (); diff --git a/src/core/fv-trace-source.h b/src/core/fv-trace-source.h index 5b9f44df4..c0f816dbb 100644 --- a/src/core/fv-trace-source.h +++ b/src/core/fv-trace-source.h @@ -46,6 +46,9 @@ public: virtual void RemoveCallback (CallbackBase const & callback) { m_callback.RemoveCallback (callback); } + virtual void ConnectPrinter (std::ostream &os, const TraceContext &context) { + m_callback.ConnectPrinter (os, context); + } protected: void notify (double oldVal, double newVal) { if (oldVal != newVal) diff --git a/src/core/object.cc b/src/core/object.cc index 85f180cf0..ce87c0f63 100644 --- a/src/core/object.cc +++ b/src/core/object.cc @@ -68,6 +68,7 @@ public: virtual void Disconnect (std::string path, CallbackBase const &cb); virtual void CollectSources (std::string path, const TraceContext &context, SourceCollection *collection); + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context); private: Ptr ParseForInterface (std::string path); Ptr m_aggregate; @@ -114,6 +115,11 @@ InterfaceIdTraceResolver::CollectSources (std::string path, const TraceContext & { m_aggregate->DoCollectSources (path, context, collection); } +void +InterfaceIdTraceResolver::ConnectPrinterToAll (std::ostream &os, const TraceContext &context) +{ + m_aggregate->DoConnectPrinterToAll (os, context); +} InterfaceId::InterfaceId (uint16_t iid) @@ -333,6 +339,31 @@ Object::DoCollectSources (std::string path, const TraceContext &context, m_collecting = false; } +void +Object::DoConnectPrinterToAll (std::ostream &os, const TraceContext &context) const +{ + const Object *current; + current = this; + do { + if (current->m_collecting) + { + return; + } + current = current->m_next; + } while (current != this); + + m_collecting = true; + + current = this->m_next; + while (current != this) + { + NS_ASSERT (current != 0); + current->GetTraceResolver ()->ConnectPrinterToAll (os, context); + current = current->m_next; + } + + m_collecting = false; +} } // namespace ns3 diff --git a/src/core/object.h b/src/core/object.h index ea4f091db..9cc5a0f68 100644 --- a/src/core/object.h +++ b/src/core/object.h @@ -184,6 +184,7 @@ private: Ptr DoQueryInterface (InterfaceId iid) const; void DoCollectSources (std::string path, const TraceContext &context, TraceResolver::SourceCollection *collection) const; + void DoConnectPrinterToAll (std::ostream &os, const TraceContext &context) const; bool Check (void) const; void MaybeDelete (void) const; mutable uint32_t m_count; diff --git a/src/core/sv-trace-source.h b/src/core/sv-trace-source.h index 23d28f988..8cbb2447b 100644 --- a/src/core/sv-trace-source.h +++ b/src/core/sv-trace-source.h @@ -46,6 +46,9 @@ public: virtual void RemoveCallback (CallbackBase const & callback) { m_callback.RemoveCallback (callback); } + virtual void ConnectPrinter (std::ostream &os, const TraceContext &context) { + m_callback.ConnectPrinter (os, context); + } protected: void Notify (int64_t oldVal, int64_t newVal) { if (oldVal != newVal) diff --git a/src/core/trace-resolver.h b/src/core/trace-resolver.h index c78a6f21d..f3e0d101a 100644 --- a/src/core/trace-resolver.h +++ b/src/core/trace-resolver.h @@ -100,6 +100,8 @@ public: */ virtual void CollectSources (std::string path, const TraceContext &context, SourceCollection *collection) = 0; + + virtual void ConnectPrinterToAll (std::ostream &os, const TraceContext &context) = 0; protected: /** * \param path a namespace path diff --git a/src/core/trace-source.h b/src/core/trace-source.h index f9ee2ddac..9a35a80ad 100644 --- a/src/core/trace-source.h +++ b/src/core/trace-source.h @@ -21,6 +21,8 @@ #ifndef TRACE_SOURCE_H #define TRACE_SOURCE_H +#include + namespace ns3 { class CallbackBase; @@ -51,6 +53,7 @@ public: * \param callback the callback to disconnect from this trace source */ virtual void RemoveCallback (CallbackBase const & callback) = 0; + virtual void ConnectPrinter (std::ostream &os, TraceContext const &context) = 0; }; } // namespace ns3 diff --git a/src/core/uv-trace-source.h b/src/core/uv-trace-source.h index ff248bbf4..0fe84c826 100644 --- a/src/core/uv-trace-source.h +++ b/src/core/uv-trace-source.h @@ -47,7 +47,10 @@ public: m_callback.AddCallback (callback, context); } virtual void RemoveCallback (CallbackBase const & callback) { - m_callback.RemoveCallback (callback); + m_callback.RemoveCallback (callback); + } + virtual void ConnectPrinter (std::ostream &os, const TraceContext &context) { + m_callback.ConnectPrinter (os, context); } protected: diff --git a/src/node/node-list.cc b/src/node/node-list.cc index 3a68bf584..95a009bbb 100644 --- a/src/node/node-list.cc +++ b/src/node/node-list.cc @@ -171,6 +171,11 @@ NodeList::Disconnect (std::string name, const CallbackBase &cb) { SimulationSingleton::Get ()->GetTraceResolver ()->Disconnect (name, cb); } +void +NodeList::ConnectPrinterToAll (std::ostream &os) +{ + SimulationSingleton::Get ()->GetTraceResolver ()->ConnectPrinterToAll (os, TraceContext ()); +} Ptr NodeList::GetTraceResolver (void) { diff --git a/src/node/node-list.h b/src/node/node-list.h index 4a6c113bf..02c638bbf 100644 --- a/src/node/node-list.h +++ b/src/node/node-list.h @@ -101,6 +101,7 @@ public: * the input namespace regexp. */ static void Disconnect (std::string name, const CallbackBase &cb); + static void ConnectPrinterToAll (std::ostream &os); static Ptr GetTraceResolver (void); private: };