add support for NodeList::ConnectPrinterToAll

This commit is contained in:
Mathieu Lacage
2007-09-06 12:56:31 +02:00
parent 8b5b6d3636
commit 1a75a82523
15 changed files with 210 additions and 3 deletions

View File

@@ -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-<nodeId>-<interfaceId>

View File

@@ -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<INDEX>::CollectSources (std::string path, const TraceContext
}
}
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

View File

@@ -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::RunTests (void)
CallbackTraceSourceTest g_callbackTraceTest;
}//namespace ns3
#endif /* RUN_SELF_TESTS */

View File

@@ -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<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 @@ CallbackTraceSource<T1,T2,T3,T4>::RemoveCallback (CallbackBase const & callback)
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 ();

View File

@@ -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<Ptr<TraceResolver> > 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<Object> 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<Object> 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

View File

@@ -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<ArrayTraceResolver<INDEX> > array;
} *item = new ArrayResolveItem ();

View File

@@ -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)

View File

@@ -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<const Object> ParseForInterface (std::string path);
Ptr<const Object> 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

View File

@@ -184,6 +184,7 @@ private:
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;

View File

@@ -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)

View File

@@ -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

View File

@@ -21,6 +21,8 @@
#ifndef TRACE_SOURCE_H
#define TRACE_SOURCE_H
#include <ostream>
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

View File

@@ -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:

View File

@@ -171,6 +171,11 @@ NodeList::Disconnect (std::string name, const CallbackBase &cb)
{
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)
{

View File

@@ -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<TraceResolver> GetTraceResolver (void);
private:
};