add support for NodeList::ConnectPrinterToAll
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 06 Sep 2007 12:56:31 +0200
changeset 1419 ac2a81821ab5
parent 1418 4145333dd0e6
child 1420 3feedd3e4f5f
add support for NodeList::ConnectPrinterToAll
examples/simple-point-to-point.cc
src/core/array-trace-resolver.h
src/core/callback-trace-source.cc
src/core/callback-trace-source.h
src/core/composite-trace-resolver.cc
src/core/composite-trace-resolver.h
src/core/fv-trace-source.h
src/core/object.cc
src/core/object.h
src/core/sv-trace-source.h
src/core/trace-resolver.h
src/core/trace-source.h
src/core/uv-trace-source.h
src/node/node-list.cc
src/node/node-list.h
--- 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:
 };