avoid problems with recursive use of Object::DoCollectSources
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 28 Aug 2007 11:21:42 +0200
changeset 1374 77468496f7e0
parent 1373 0c71c081cffc
child 1375 4f45bec005b8
avoid problems with recursive use of Object::DoCollectSources
src/core/object.cc
src/core/object.h
src/core/trace-resolver.cc
src/core/trace-resolver.h
--- a/src/core/object.cc	Tue Aug 28 11:20:55 2007 +0200
+++ b/src/core/object.cc	Tue Aug 28 11:21:42 2007 +0200
@@ -23,8 +23,11 @@
 #include "singleton.h"
 #include "uid-manager.h"
 #include "trace-resolver.h"
+#include "debug.h"
 #include <vector>
 
+NS_DEBUG_COMPONENT_DEFINE ("Object");
+
 namespace {
 
 class IidManager : public ns3::UidManager
@@ -173,6 +176,7 @@
   : m_count (1),
     m_iid (Object::iid),
     m_disposed (false),
+    m_collecting (false),
     m_next (this)
 {}
 Object::~Object () 
@@ -296,15 +300,23 @@
 Object::DoCollectSources (std::string path, const TraceContext &context, 
                           TraceResolver::SourceCollection *collection)
 {
-  Object *current = this->m_next;
-  if (collection->IsFlagSet ())
-    {
-      return;
-    }
-  collection->SetFlag ();
+  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);
+      NS_DEBUG ("collect current=" << current);
       InterfaceId cur = current->m_iid;
       while (cur != Object::iid)
         {
@@ -312,12 +324,14 @@
           std::string fullpath = path;
           fullpath.append ("/$");
           fullpath.append (name);
+          NS_DEBUG ("collect: " << fullpath);
           current->GetTraceResolver ()->CollectSources (fullpath, context, collection);
           cur = InterfaceId::LookupParent (cur);
         }
       current = current->m_next;
     }
-  collection->ClearFlag ();
+
+  m_collecting = false;
 }
 
 } // namespace ns3
--- a/src/core/object.h	Tue Aug 28 11:20:55 2007 +0200
+++ b/src/core/object.h	Tue Aug 28 11:21:42 2007 +0200
@@ -170,6 +170,7 @@
   mutable uint32_t m_count;
   InterfaceId m_iid;
   bool m_disposed;
+  bool m_collecting;
   Object *m_next;
 };
 
--- a/src/core/trace-resolver.cc	Tue Aug 28 11:20:55 2007 +0200
+++ b/src/core/trace-resolver.cc	Tue Aug 28 11:21:42 2007 +0200
@@ -108,22 +108,4 @@
     }
 }
 
-void 
-TraceResolver::SourceCollection::SetFlag (void)
-{
-  m_flag = true;
-}
-
-void 
-TraceResolver::SourceCollection::ClearFlag (void)
-{
-  m_flag = false;
-}
-bool 
-TraceResolver::SourceCollection::IsFlagSet (void)
-{
-  return m_flag;
-}
-
-
 }//namespace ns3
--- a/src/core/trace-resolver.h	Tue Aug 28 11:20:55 2007 +0200
+++ b/src/core/trace-resolver.h	Tue Aug 28 11:21:42 2007 +0200
@@ -76,9 +76,6 @@
     void Print (std::ostream &os) const;
     void AddUnique (std::string path, const TraceContext &context,
                     std::string help);
-    void SetFlag (void);
-    void ClearFlag (void);
-    bool IsFlagSet (void);
   private:
     struct Source
     {
@@ -88,7 +85,6 @@
     };
     typedef std::vector<struct Source> SourceVector;
     SourceVector m_sources;
-    bool m_flag;
   };
   virtual void CollectSources (std::string path, const TraceContext &context, 
                                SourceCollection *collection) = 0;