--- a/examples/simple-point-to-point.cc Thu Sep 06 12:33:22 2007 +0200
+++ b/examples/simple-point-to-point.cc Thu Sep 06 12:56:31 2007 +0200
@@ -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 @@
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-<nodeId>-<interfaceId>
--- a/src/core/array-trace-resolver.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/array-trace-resolver.h Thu Sep 06 12:56:31 2007 +0200
@@ -64,6 +64,7 @@
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 @@
}
}
+template <typename INDEX>
+void
+ArrayTraceResolver<INDEX>::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<Object> obj = m_iter->Get ();
+ obj->GetTraceResolver ()->ConnectPrinterToAll (os, tmp);
+ j++;
+ }
+}
}//namespace ns3
--- a/src/core/callback-trace-source.cc Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/callback-trace-source.cc Thu Sep 06 12:56:31 2007 +0200
@@ -19,6 +19,9 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "callback-trace-source.h"
+
+#ifdef RUN_SELF_TESTS
+
#include "test.h"
namespace ns3 {
@@ -93,6 +96,6 @@
CallbackTraceSourceTest g_callbackTraceTest;
-
+}//namespace ns3
-}//namespace ns3
+#endif /* RUN_SELF_TESTS */
--- a/src/core/callback-trace-source.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/callback-trace-source.h Thu Sep 06 12:56:31 2007 +0200
@@ -44,6 +44,7 @@
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 @@
namespace ns3 {
+namespace internal {
+
+template<typename T1, typename T2,
+ typename T3, typename T4>
+class TraceSinkPrint;
+
+template<typename T1, typename T2,
+ typename T3, typename T4>
+class TraceSinkPrint
+{
+public:
+ static Callback<void,const TraceContext &,T1,T2,T3,T4> 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<typename T1, typename T2,
+ typename T3>
+class TraceSinkPrint<T1,T2,T3,empty>
+{
+public:
+ static Callback<void,const TraceContext &,T1,T2,T3> 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<typename T1, typename T2>
+class TraceSinkPrint<T1,T2,empty,empty>
+{
+public:
+ static Callback<void,const TraceContext &,T1,T2> 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<typename T1>
+class TraceSinkPrint<T1,empty,empty,empty>
+{
+public:
+ static Callback<void,const TraceContext &,T1> 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<empty,empty,empty,empty>
+{
+public:
+ static Callback<void,const TraceContext &> 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<typename T1, typename T2,
typename T3, typename T4>
CallbackTraceSource<T1,T2,T3,T4>::CallbackTraceSource ()
@@ -99,6 +186,13 @@
template<typename T1, typename T2,
typename T3, typename T4>
void
+CallbackTraceSource<T1,T2,T3,T4>::ConnectPrinter (std::ostream &os, const TraceContext &context)
+{
+ AddCallback (ns3::internal::TraceSinkPrint<T1,T2,T3,T4>::Make (os), context);
+}
+template<typename T1, typename T2,
+ typename T3, typename T4>
+void
CallbackTraceSource<T1,T2,T3,T4>::operator() (void) const
{
for (typename CallbackList::const_iterator i = m_callbackList.begin ();
--- a/src/core/composite-trace-resolver.cc Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/composite-trace-resolver.cc Thu Sep 06 12:56:31 2007 +0200
@@ -63,6 +63,12 @@
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<Ptr<TraceResolver> > maker;
} *item = new MakerResolveItem ();
item->name = name;
@@ -101,6 +107,12 @@
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 @@
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<Object> composite;
} *item = new CompositeResolveItem ();
@@ -293,6 +311,19 @@
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
--- a/src/core/composite-trace-resolver.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/composite-trace-resolver.h Thu Sep 06 12:56:31 2007 +0200
@@ -120,6 +120,7 @@
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 @@
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 @@
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<ArrayTraceResolver<INDEX> > array;
} *item = new ArrayResolveItem ();
--- a/src/core/fv-trace-source.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/fv-trace-source.h Thu Sep 06 12:56:31 2007 +0200
@@ -46,6 +46,9 @@
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)
--- a/src/core/object.cc Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/object.cc Thu Sep 06 12:56:31 2007 +0200
@@ -68,6 +68,7 @@
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<const Object> ParseForInterface (std::string path);
Ptr<const Object> m_aggregate;
@@ -114,6 +115,11 @@
{
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 @@
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
--- a/src/core/object.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/object.h Thu Sep 06 12:56:31 2007 +0200
@@ -184,6 +184,7 @@
Ptr<Object> 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;
--- a/src/core/sv-trace-source.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/sv-trace-source.h Thu Sep 06 12:56:31 2007 +0200
@@ -46,6 +46,9 @@
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)
--- a/src/core/trace-resolver.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/trace-resolver.h Thu Sep 06 12:56:31 2007 +0200
@@ -100,6 +100,8 @@
*/
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
--- a/src/core/trace-source.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/trace-source.h Thu Sep 06 12:56:31 2007 +0200
@@ -21,6 +21,8 @@
#ifndef TRACE_SOURCE_H
#define TRACE_SOURCE_H
+#include <ostream>
+
namespace ns3 {
class CallbackBase;
@@ -51,6 +53,7 @@
* \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
--- a/src/core/uv-trace-source.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/core/uv-trace-source.h Thu Sep 06 12:56:31 2007 +0200
@@ -47,7 +47,10 @@
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:
--- a/src/node/node-list.cc Thu Sep 06 12:33:22 2007 +0200
+++ b/src/node/node-list.cc Thu Sep 06 12:56:31 2007 +0200
@@ -171,6 +171,11 @@
{
SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->Disconnect (name, cb);
}
+void
+NodeList::ConnectPrinterToAll (std::ostream &os)
+{
+ SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->ConnectPrinterToAll (os, TraceContext ());
+}
Ptr<TraceResolver>
NodeList::GetTraceResolver (void)
{
--- a/src/node/node-list.h Thu Sep 06 12:33:22 2007 +0200
+++ b/src/node/node-list.h Thu Sep 06 12:56:31 2007 +0200
@@ -101,6 +101,7 @@
* the input namespace regexp.
*/
static void Disconnect (std::string name, const CallbackBase &cb);
+ static void ConnectPrinterToAll (std::ostream &os);
static Ptr<TraceResolver> GetTraceResolver (void);
private:
};