add support for NodeList::ConnectPrinterToAll
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user