use ref/unref for Node in more cases

Mathieu Lacage 2007-05-02 15:07:33 +02:00
parent 48899c0ba7
commit 9021652bd3
9 changed files with 73 additions and 50 deletions

View File

@ -118,7 +118,7 @@ int main (int argc, char *argv[])
// Create the OnOff application to send UDP datagrams of size
// 210 bytes at a rate of 448 Kb/s
OnOffApplication* ooff0 = new OnOffApplication(
*n0,
n0,
Ipv4Address("10.1.3.2"),
80,
ConstantVariable(1),
@ -133,7 +133,7 @@ int main (int argc, char *argv[])
// Create a similar flow from n3 to n1, starting at time 1.1 seconds
OnOffApplication* ooff1 = new OnOffApplication(
*n3,
n3,
Ipv4Address("10.1.2.1"),
80,
ConstantVariable(1),

View File

@ -40,7 +40,7 @@ ApplicationList::~ApplicationList()
{ // Destructor, nothing needed as the SmartSet destroys itself
}
ApplicationList* ApplicationList::Copy(Node& n) const
ApplicationList* ApplicationList::Copy(Node * n) const
{ // Copy this app list
ApplicationList* r = new ApplicationList();
r->SetNode(n);
@ -53,7 +53,7 @@ ApplicationList::Add(Application* a)
m_apps.Add(a);
}
void ApplicationList::SetNode(Node& n)
void ApplicationList::SetNode(Node * n)
{
Capability::SetNode(n);
// Set the node pointer in each application

View File

@ -37,8 +37,8 @@ public:
// Copy constructor not needed, default one is correct
~ApplicationList();
// Inherited from Capabilty
virtual ApplicationList* Copy(Node&) const;
virtual void SetNode(Node&); // Sets the node for all apps
virtual ApplicationList* Copy(Node*) const;
virtual void SetNode(Node *); // Sets the node for all apps
virtual void Add(Application*); // Add an already new'ed app
// Manage the list
template <typename T> T* AddCopy(const T& t) // Add a new application

View File

@ -23,7 +23,6 @@
#include "application.h"
#include "node.h"
#include "node-reference.h"
#include "ns3/nstime.h"
#include "ns3/random-variable.h"
#include "ns3/simulator.h"
@ -35,19 +34,20 @@ namespace ns3 {
// Application Methods
// \brief Application Constructor
Application::Application(const Node& n)
: m_node (0),
Application::Application(Node * n)
: m_node (n),
m_startVar(0), m_stopVar(0),
m_start(false), m_stop(false)
{
SetNode(n);
m_node->Ref ();
}
Application::Application(const Application& o)
: m_node(0), m_startVar(0), m_stopVar(0),
m_start(false), m_stop(false)
{ // Copy constructor
if (o.GetNode())m_node = new NodeReference(*o.GetNode());
m_node = o.m_node;
m_node->Ref ();
// Copy the start and stop random variables if they exist
if (o.m_startVar) m_startVar = o.m_startVar->Copy();
if (o.m_stopVar) m_stopVar = o.m_stopVar->Copy();
@ -59,7 +59,7 @@ Application::Application(const Application& o)
// \brief Application Destructor
Application::~Application()
{
delete m_node;
m_node->Unref ();
// Cancel the start/stop events if scheduled
if (m_start) Simulator::Cancel(m_startEvent);
if (m_stop) Simulator::Cancel(m_stopEvent);
@ -71,9 +71,10 @@ Application::~Application()
Application& Application::operator=(const Application& rhs)
{
if (this == &rhs) return *this; // Self assignment
delete m_node;
m_node->Unref ();
m_node = 0;
if (rhs.GetNode())m_node = new NodeReference(*rhs.GetNode());
m_node = rhs.m_node;
m_node->Ref ();
delete m_startVar;
m_startVar = 0;
@ -130,15 +131,19 @@ void Application::Stop(const RandomVariable& stopVar)
// \brief Assign this application to a given node
// Called by the application manager capability when adding
// an application to a node.
void Application::SetNode(const Node& n)
void Application::SetNode(Node * n)
{
delete m_node;
m_node = new NodeReference(n);
if (m_node != 0)
{
m_node->Unref ();
}
m_node = n;
m_node->Ref ();
}
Node* Application::GetNode() const
Node* Application::PeekNode() const
{
return m_node->GetNode();
return m_node;
}
// Protected methods

View File

@ -54,11 +54,10 @@ namespace ns3 {
class Node;
class RandomVariable;
class NodeReference;
class Application {
public:
Application(const Node&);
Application(Node *);
Application(const Application&); // Copy constructor
Application& operator=(const Application&); // Assignment operator
virtual ~Application();
@ -99,13 +98,13 @@ void Start(const RandomVariable&);
// \brief Attaches an application to a specific node
// Specifies which node object this application is associated with.
// \param Node object to associate with this application.
void SetNode(const Node&);
void SetNode(Node *);
// \brief Returns the pointer to the attached node.
Node* GetNode() const;
Node* PeekNode() const;
// Members
NodeReference* m_node; // All applications have an associated node
Node * m_node; // All applications have an associated node
RandomVariable* m_startVar; // Random variable for start time
RandomVariable* m_stopVar; // Random variable for stop time
EventId m_startEvent;// Event identifier for start event

View File

@ -23,7 +23,6 @@
#include "capability.h"
#include "node.h"
#include "node-reference.h"
namespace ns3 {
@ -33,47 +32,67 @@ Capability::Capability()
}
Capability::Capability(Node* n)
: m_node (n)
{
m_node = new NodeReference(*n);
m_node->Ref ();
}
Capability::~Capability ()
{
if (m_node != 0)
{
m_node->Unref ();
}
}
// Copy constructor
Capability::Capability(const Capability& o)
: m_node (o.m_node)
{
m_node = new NodeReference(*o.GetNode());
if (m_node != 0)
{
m_node->Ref ();
}
}
// Assignment operator
Capability& Capability::operator=(const Capability& rhs)
{
if (this == &rhs) return *this; // Self assignment
delete m_node;
m_node = new NodeReference(*rhs.GetNode());
if (m_node != 0)
{
m_node->Unref ();
}
m_node = rhs.m_node;
if (m_node != 0)
{
m_node->Ref ();
}
return *this;
}
Capability::~Capability()
{
delete m_node;
}
// SetNode should be overridden by any capability subclass
// that manages other objects needing node information, such
// as the ApplicationList.
void Capability::SetNode(Node& n)
void Capability::SetNode(Node *node)
{
delete m_node;
m_node = new NodeReference(n);
if (m_node != 0)
{
m_node->Unref ();
}
m_node = node;
if (m_node != 0)
{
m_node->Ref ();
}
}
Node* Capability::GetNode() const
{
if (!m_node) return 0;
return m_node->GetNode();
m_node->Ref ();
return m_node;
}
} // namespace ns3

View File

@ -42,11 +42,11 @@ public:
Capability(const Capability&); // Copy constructor
virtual Capability& operator=(const Capability&); // Assignment operator
virtual ~Capability();
virtual Capability* Copy(Node&) const = 0;
virtual void SetNode(Node&);
virtual Capability* Copy(Node *node) const = 0;
virtual void SetNode(Node *node);
virtual Node* GetNode() const;
private:
NodeReference* m_node; // Node on which this capability is assigned
Node* m_node; // Node on which this capability is assigned
};
} //namespace ns3

View File

@ -43,7 +43,7 @@ uint32_t OnOffApplication::g_defaultSize = 512;
// Constructors
OnOffApplication::OnOffApplication(const Node& n,
OnOffApplication::OnOffApplication(Node * n,
const Ipv4Address rip, // Remote IP addr
uint16_t rport, // Remote port
const RandomVariable& ontime,
@ -68,7 +68,7 @@ uint32_t OnOffApplication::g_defaultSize = 512;
{
}
OnOffApplication::OnOffApplication(const Node& n, const OnOffApplication& c)
OnOffApplication::OnOffApplication(Node * n, const OnOffApplication& c)
: Application(n),
m_socket(0),
m_peerIP(c.m_peerIP),
@ -148,7 +148,7 @@ void OnOffApplication::StartApplication() // Called at time specified by Star
if (!m_socket)
{ // Create the socket using the specified layer 4 protocol
#ifdef NOTYET
m_socket = GetNode()->GetKernel()->CreateGenericSocket(*m_l4Proto);
m_socket = PeekNode()->GetKernel()->CreateGenericSocket(*m_l4Proto);
m_socket->Bind(); // Choose any available port local port
m_socket->Connect(*m_peerIP, m_peerPort,
MakeCallback(&OnOffApplication::ConnectionSucceeded,
@ -156,7 +156,7 @@ void OnOffApplication::StartApplication() // Called at time specified by Star
MakeCallback(&OnOffApplication::ConnectionFailed,
this));
#endif
m_socket = GetNode ()->GetUdp ()->CreateSocket ();
m_socket = PeekNode ()->GetUdp ()->CreateSocket ();
m_socket->Connect (m_peerIP, m_peerPort);
}
StopApplication(); // Insure no pending event

View File

@ -40,7 +40,7 @@ class DataRate;
class OnOffApplication : public Application {
public:
OnOffApplication(const Node& n,
OnOffApplication(Node * n,
const Ipv4Address, // Peer IP address
uint16_t, // Peer port
const RandomVariable&, // Random variable for On time
@ -48,7 +48,7 @@ public:
DataRate = g_defaultRate, // Data rate when on
uint32_t = g_defaultSize); // Size of packets
OnOffApplication(const Node& n, const OnOffApplication&); // Copy constructor
OnOffApplication(Node * n, const OnOffApplication&); // Copy constructor
virtual ~OnOffApplication(); // Destructor
virtual void StartApplication(); // Called at time specified by Start
virtual void StopApplication(); // Called at time specified by Stop