merge tracing overhaul in trunk
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "ns3/assert.h"
|
||||
#include "ns3/object.h"
|
||||
#include "ns3/debug.h"
|
||||
#include "ns3/trace-resolver.h"
|
||||
|
||||
|
||||
#include "channel.h"
|
||||
@@ -183,12 +184,6 @@ NetDevice::Send(const Packet& p, const Address& dest, uint16_t protocolNumber)
|
||||
}
|
||||
}
|
||||
|
||||
TraceResolver *
|
||||
NetDevice::CreateTraceResolver (TraceContext const &context)
|
||||
{
|
||||
return DoCreateTraceResolver (context);
|
||||
}
|
||||
|
||||
Ptr<Channel>
|
||||
NetDevice::GetChannel (void) const
|
||||
{
|
||||
|
||||
@@ -62,14 +62,6 @@ public:
|
||||
static const InterfaceId iid;
|
||||
virtual ~NetDevice();
|
||||
|
||||
/**
|
||||
* \param context the trace context to use to construct the
|
||||
* TraceResolver to return
|
||||
* \returns a TraceResolver which can resolve all traces
|
||||
* performed in this object. The caller must
|
||||
* delete the returned object.
|
||||
*/
|
||||
TraceResolver *CreateTraceResolver (TraceContext const &context);
|
||||
|
||||
/**
|
||||
* \return the channel this NetDevice is connected to. The value
|
||||
@@ -282,15 +274,6 @@ public:
|
||||
* Subclasses must implement this method.
|
||||
*/
|
||||
virtual bool DoNeedsArp (void) const = 0;
|
||||
/**
|
||||
* \param context the trace context to associated to the
|
||||
* trace resolver.
|
||||
* \returns a trace resolver associated to the input context.
|
||||
* the caller takes ownership of the pointer returned.
|
||||
*
|
||||
* Subclasses must implement this method.
|
||||
*/
|
||||
virtual TraceResolver *DoCreateTraceResolver (TraceContext const &context) = 0;
|
||||
/**
|
||||
* \returns the channel associated to this NetDevice.
|
||||
*
|
||||
|
||||
@@ -20,24 +20,12 @@
|
||||
* Mathieu Lacage <mathieu.lacage@sophia.inria.fr>,
|
||||
*/
|
||||
|
||||
#include "ns3/array-trace-resolver.h"
|
||||
#include "ns3/trace-root.h"
|
||||
#include "ns3/composite-trace-resolver.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/simulation-singleton.h"
|
||||
#include "node-list.h"
|
||||
#include "node.h"
|
||||
|
||||
namespace {
|
||||
static class Initialization
|
||||
{
|
||||
public:
|
||||
Initialization ()
|
||||
{
|
||||
ns3::TraceRoot::Register ("nodes", ns3::MakeCallback (&ns3::NodeList::CreateTraceResolver));
|
||||
}
|
||||
} g_initialization;
|
||||
}
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
NodeListIndex::NodeListIndex ()
|
||||
@@ -62,6 +50,11 @@ NodeListIndex::Get (void) const
|
||||
{
|
||||
return m_index;
|
||||
}
|
||||
std::string
|
||||
NodeListIndex::GetTypeName (void) const
|
||||
{
|
||||
return "ns3::NodeListIndex";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -74,9 +67,9 @@ public:
|
||||
~NodeListPriv ();
|
||||
|
||||
uint32_t Add (Ptr<Node> node);
|
||||
NodeList::Iterator Begin (void);
|
||||
NodeList::Iterator End (void);
|
||||
TraceResolver *CreateTraceResolver (TraceContext const &context);
|
||||
NodeList::Iterator Begin (void) const;
|
||||
NodeList::Iterator End (void) const;
|
||||
Ptr<TraceResolver> GetTraceResolver (void) const;
|
||||
Ptr<Node> GetNode (uint32_t n);
|
||||
uint32_t GetNNodes (void);
|
||||
|
||||
@@ -108,12 +101,12 @@ NodeListPriv::Add (Ptr<Node> node)
|
||||
|
||||
}
|
||||
NodeList::Iterator
|
||||
NodeListPriv::Begin (void)
|
||||
NodeListPriv::Begin (void) const
|
||||
{
|
||||
return m_nodes.begin ();
|
||||
}
|
||||
NodeList::Iterator
|
||||
NodeListPriv::End (void)
|
||||
NodeListPriv::End (void) const
|
||||
{
|
||||
return m_nodes.end ();
|
||||
}
|
||||
@@ -130,14 +123,11 @@ NodeListPriv::GetNode (uint32_t n)
|
||||
}
|
||||
|
||||
|
||||
TraceResolver *
|
||||
NodeListPriv::CreateTraceResolver (TraceContext const &context)
|
||||
Ptr<TraceResolver>
|
||||
NodeListPriv::GetTraceResolver (void) const
|
||||
{
|
||||
ArrayTraceResolver<Ptr<Node>, NodeListIndex> *resolver =
|
||||
new ArrayTraceResolver<Ptr<Node>, NodeListIndex>
|
||||
(context,
|
||||
MakeCallback (&NodeListPriv::GetNNodes, this),
|
||||
MakeCallback (&NodeListPriv::GetNode, this));
|
||||
Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
|
||||
resolver->AddArray ("nodes", Begin (), End (), NodeListIndex ());
|
||||
return resolver;
|
||||
}
|
||||
|
||||
@@ -165,17 +155,30 @@ NodeList::End (void)
|
||||
{
|
||||
return SimulationSingleton<NodeListPriv>::Get ()->End ();
|
||||
}
|
||||
TraceResolver *
|
||||
NodeList::CreateTraceResolver (TraceContext const &context)
|
||||
{
|
||||
return SimulationSingleton<NodeListPriv>::Get ()->CreateTraceResolver (context);
|
||||
}
|
||||
Ptr<Node>
|
||||
NodeList::GetNode (uint32_t n)
|
||||
{
|
||||
return SimulationSingleton<NodeListPriv>::Get ()->GetNode (n);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
NodeList::Connect (std::string name, const CallbackBase &cb)
|
||||
{
|
||||
SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->Connect (name, cb, TraceContext ());
|
||||
}
|
||||
void
|
||||
NodeList::Disconnect (std::string name, const CallbackBase &cb)
|
||||
{
|
||||
SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->Disconnect (name, cb);
|
||||
}
|
||||
void
|
||||
NodeList::TraceAll (std::ostream &os)
|
||||
{
|
||||
SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ()->TraceAll (os, TraceContext ());
|
||||
}
|
||||
Ptr<TraceResolver>
|
||||
NodeList::GetTraceResolver (void)
|
||||
{
|
||||
return SimulationSingleton<NodeListPriv>::Get ()->GetTraceResolver ();
|
||||
}
|
||||
}//namespace ns3
|
||||
|
||||
@@ -29,9 +29,12 @@
|
||||
namespace ns3 {
|
||||
|
||||
class Node;
|
||||
class CallbackBase;
|
||||
class TraceResolver;
|
||||
class TraceContext;
|
||||
|
||||
/**
|
||||
* \brief hold in a TraceContext the index of a node within a NodeList.
|
||||
*/
|
||||
class NodeListIndex : public TraceContextElement
|
||||
{
|
||||
public:
|
||||
@@ -39,7 +42,11 @@ public:
|
||||
NodeListIndex (uint32_t index);
|
||||
void Print (std::ostream &os);
|
||||
static uint16_t GetUid (void);
|
||||
/**
|
||||
* \returns the index of the node within the NodeList
|
||||
*/
|
||||
uint32_t Get (void) const;
|
||||
std::string GetTypeName (void) const;
|
||||
private:
|
||||
uint32_t m_index;
|
||||
};
|
||||
@@ -53,7 +60,7 @@ private:
|
||||
class NodeList
|
||||
{
|
||||
public:
|
||||
typedef std::vector< Ptr<Node> >::iterator Iterator;
|
||||
typedef std::vector< Ptr<Node> >::const_iterator Iterator;
|
||||
|
||||
/**
|
||||
* \param node node to add
|
||||
@@ -73,19 +80,30 @@ public:
|
||||
* list.
|
||||
*/
|
||||
static Iterator End (void);
|
||||
/**
|
||||
* \param context trace context to use for trace resolver
|
||||
* to create.
|
||||
* \returns the requested trace resolver. The caller
|
||||
* takes ownership of the returned pointer.
|
||||
*/
|
||||
static TraceResolver *CreateTraceResolver (TraceContext const &context);
|
||||
|
||||
/**
|
||||
* \param n index of requested node.
|
||||
* \returns the Node associated to index n.
|
||||
*/
|
||||
static Ptr<Node> GetNode (uint32_t n);
|
||||
/**
|
||||
* \param name namespace regexp to match
|
||||
* \param cb callback to connect
|
||||
*
|
||||
* Connect input callback to all trace sources which match
|
||||
* the input namespace regexp.
|
||||
*/
|
||||
static void Connect (std::string name, const CallbackBase &cb);
|
||||
/**
|
||||
* \param name namespace regexp to match
|
||||
* \param cb callback to connect
|
||||
*
|
||||
* Disconnect input callback from all trace sources which match
|
||||
* the input namespace regexp.
|
||||
*/
|
||||
static void Disconnect (std::string name, const CallbackBase &cb);
|
||||
static void TraceAll (std::ostream &os);
|
||||
static Ptr<TraceResolver> GetTraceResolver (void);
|
||||
private:
|
||||
};
|
||||
|
||||
}//namespace ns3
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
#include "packet-socket-factory.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/composite-trace-resolver.h"
|
||||
#include "ns3/array-trace-resolver.h"
|
||||
|
||||
namespace ns3{
|
||||
|
||||
@@ -53,6 +52,11 @@ NodeNetDeviceIndex::GetUid (void)
|
||||
static uint16_t uid = AllocateUid<NodeNetDeviceIndex> ("NodeNetDeviceIndex");
|
||||
return uid;
|
||||
}
|
||||
std::string
|
||||
NodeNetDeviceIndex::GetTypeName (void) const
|
||||
{
|
||||
return "ns3::NodeNetDeviceIndex";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -82,11 +86,12 @@ Node::Construct (void)
|
||||
Node::~Node ()
|
||||
{}
|
||||
|
||||
TraceResolver *
|
||||
Node::CreateTraceResolver (TraceContext const &context)
|
||||
Ptr<TraceResolver>
|
||||
Node::GetTraceResolver (void) const
|
||||
{
|
||||
CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
|
||||
DoFillTraceResolver (*resolver);
|
||||
Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
|
||||
resolver->AddArray ("devices", m_devices.begin (), m_devices.end (), NodeNetDeviceIndex ());
|
||||
resolver->SetParentResolver (Object::GetTraceResolver ());
|
||||
return resolver;
|
||||
}
|
||||
|
||||
@@ -141,25 +146,6 @@ Node::GetNApplications (void) const
|
||||
return m_applications.size ();
|
||||
}
|
||||
|
||||
TraceResolver *
|
||||
Node::CreateDevicesTraceResolver (const TraceContext &context)
|
||||
{
|
||||
ArrayTraceResolver<Ptr<NetDevice>,NodeNetDeviceIndex> *resolver =
|
||||
new ArrayTraceResolver<Ptr<NetDevice>,NodeNetDeviceIndex>
|
||||
(context,
|
||||
MakeCallback (&Node::GetNDevices, this),
|
||||
MakeCallback (&Node::GetDevice, this));
|
||||
|
||||
return resolver;
|
||||
}
|
||||
|
||||
void
|
||||
Node::DoFillTraceResolver (CompositeTraceResolver &resolver)
|
||||
{
|
||||
resolver.Add ("devices",
|
||||
MakeCallback (&Node::CreateDevicesTraceResolver, this));
|
||||
}
|
||||
|
||||
void
|
||||
Node::DoDispose()
|
||||
{
|
||||
|
||||
@@ -37,13 +37,20 @@ class Packet;
|
||||
class Address;
|
||||
class CompositeTraceResolver;
|
||||
|
||||
/**
|
||||
* \brief hold in a TraceContext the index of a NetDevice within a Node
|
||||
*/
|
||||
class NodeNetDeviceIndex : public TraceContextElement
|
||||
{
|
||||
public:
|
||||
NodeNetDeviceIndex ();
|
||||
NodeNetDeviceIndex (uint32_t index);
|
||||
/**
|
||||
* \returns the index of the NetDevice within its container Node.
|
||||
*/
|
||||
uint32_t Get (void) const;
|
||||
void Print (std::ostream &os) const;
|
||||
std::string GetTypeName (void) const;
|
||||
static uint16_t GetUid (void);
|
||||
private:
|
||||
uint32_t m_index;
|
||||
@@ -84,17 +91,6 @@ public:
|
||||
|
||||
virtual ~Node();
|
||||
|
||||
/**
|
||||
* \param context the trace context for the TraceResolver to create
|
||||
* \returns a newly-created TraceResolver. The caller takes
|
||||
* ownership of the returned pointer.
|
||||
*
|
||||
* Request the Node to create a trace resolver. This method
|
||||
* could be used directly by a user who needs access to very low-level
|
||||
* trace configuration.
|
||||
*/
|
||||
TraceResolver *CreateTraceResolver (TraceContext const &context);
|
||||
|
||||
/**
|
||||
* \returns the unique id of this node.
|
||||
*
|
||||
@@ -183,23 +179,15 @@ public:
|
||||
void UnregisterProtocolHandler (ProtocolHandler handler);
|
||||
|
||||
protected:
|
||||
virtual Ptr<TraceResolver> GetTraceResolver (void) const;
|
||||
/**
|
||||
* The dispose method. Subclasses must override this method
|
||||
* and must chain up to it by calling Node::DoDispose at the
|
||||
* end of their own DoDispose method.
|
||||
*/
|
||||
virtual void DoDispose (void);
|
||||
/**
|
||||
* \param resolver the resolver to store trace sources in.
|
||||
*
|
||||
* If a subclass wants to add new traces to a Node, it needs
|
||||
* to override this method and record the new trace sources
|
||||
* in the input resolver. Subclasses also _must_ chain up to
|
||||
* their parent's DoFillTraceResolver method prior
|
||||
* to recording they own trace sources.
|
||||
*/
|
||||
virtual void DoFillTraceResolver (CompositeTraceResolver &resolver);
|
||||
private:
|
||||
|
||||
/**
|
||||
* \param device the device added to this Node.
|
||||
*
|
||||
@@ -213,7 +201,6 @@ private:
|
||||
bool ReceiveFromDevice (Ptr<NetDevice> device, const Packet &packet,
|
||||
uint16_t protocol, const Address &from);
|
||||
void Construct (void);
|
||||
TraceResolver *CreateDevicesTraceResolver (const TraceContext &context);
|
||||
|
||||
struct ProtocolHandlerEntry {
|
||||
ProtocolHandler handler;
|
||||
|
||||
@@ -32,6 +32,11 @@ static ClassIdDefaultValue g_classIdDefaultValue ("Queue", "Packet Queue",
|
||||
Queue::iid, "DropTailQueue");
|
||||
|
||||
|
||||
std::string
|
||||
QueueTraceType::GetTypeName (void) const
|
||||
{
|
||||
return "ns3::QueueTraceType";
|
||||
}
|
||||
uint16_t
|
||||
QueueTraceType::GetUid (void)
|
||||
{
|
||||
@@ -94,13 +99,23 @@ Queue::~Queue()
|
||||
NS_DEBUG("Queue::~Queue ()");
|
||||
}
|
||||
|
||||
TraceResolver *
|
||||
Queue::CreateTraceResolver (TraceContext const &context)
|
||||
Ptr<TraceResolver>
|
||||
Queue::GetTraceResolver (void) const
|
||||
{
|
||||
CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
|
||||
resolver->Add ("enqueue", m_traceEnqueue, QueueTraceType (QueueTraceType::ENQUEUE));
|
||||
resolver->Add ("dequeue", m_traceDequeue, QueueTraceType (QueueTraceType::DEQUEUE));
|
||||
resolver->Add ("drop", m_traceDrop, QueueTraceType (QueueTraceType::DROP));
|
||||
Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
|
||||
resolver->AddSource ("enqueue",
|
||||
TraceDoc ("store packet in queue",
|
||||
"const Packet &", "packet queued"),
|
||||
m_traceEnqueue, QueueTraceType (QueueTraceType::ENQUEUE));
|
||||
resolver->AddSource ("dequeue",
|
||||
TraceDoc ("remove packet from queue",
|
||||
"const Packet &", "packet dequeued"),
|
||||
m_traceDequeue, QueueTraceType (QueueTraceType::DEQUEUE));
|
||||
resolver->AddSource ("drop",
|
||||
TraceDoc ("drop packet from queue",
|
||||
"const Packet &", "packet dropped"),
|
||||
m_traceDrop, QueueTraceType (QueueTraceType::DROP));
|
||||
resolver->SetParentResolver (Object::GetTraceResolver ());
|
||||
return resolver;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,6 +37,9 @@ namespace ns3 {
|
||||
|
||||
class StringEnumDefaultValue;
|
||||
|
||||
/**
|
||||
* \brief hold in a TraceContext the type of a trace source
|
||||
*/
|
||||
class QueueTraceType : public TraceContextElement
|
||||
{
|
||||
public:
|
||||
@@ -48,10 +51,20 @@ public:
|
||||
static uint16_t GetUid (void);
|
||||
QueueTraceType ();
|
||||
QueueTraceType (enum Type type);
|
||||
/**
|
||||
* \returns true if this is an enqueue event, false otherwise.
|
||||
*/
|
||||
bool IsEnqueue (void) const;
|
||||
/**
|
||||
* \returns true if this is a dequeue event, false otherwise.
|
||||
*/
|
||||
bool IsDequeue (void) const;
|
||||
/**
|
||||
* \returns true if this is a drop event, false otherwise.
|
||||
*/
|
||||
bool IsDrop (void) const;
|
||||
void Print (std::ostream &os) const;
|
||||
std::string GetTypeName (void) const;
|
||||
private:
|
||||
enum Type m_type;
|
||||
};
|
||||
@@ -69,8 +82,6 @@ public:
|
||||
|
||||
Queue ();
|
||||
virtual ~Queue ();
|
||||
|
||||
TraceResolver *CreateTraceResolver (TraceContext const &context);
|
||||
|
||||
/**
|
||||
* \return true if the queue is empty; false otherwise
|
||||
@@ -167,6 +178,7 @@ private:
|
||||
virtual bool DoPeek (Packet &p) = 0;
|
||||
|
||||
protected:
|
||||
Ptr<TraceResolver> GetTraceResolver (void) const;
|
||||
// called by subclasses to notify parent of packet drops.
|
||||
void Drop (const Packet& p);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user