diff --git a/examples/simple-p2p.cc b/examples/simple-p2p.cc index 9d76c0789..e97cb147f 100644 --- a/examples/simple-p2p.cc +++ b/examples/simple-p2p.cc @@ -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), diff --git a/src/node/application-list.cc b/src/node/application-list.cc index f3742b14e..dc254befe 100644 --- a/src/node/application-list.cc +++ b/src/node/application-list.cc @@ -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 diff --git a/src/node/application-list.h b/src/node/application-list.h index d2d9838f7..691547ca7 100644 --- a/src/node/application-list.h +++ b/src/node/application-list.h @@ -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 T* AddCopy(const T& t) // Add a new application diff --git a/src/node/application.cc b/src/node/application.cc index 3006b6f8e..fa49cba06 100644 --- a/src/node/application.cc +++ b/src/node/application.cc @@ -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 diff --git a/src/node/application.h b/src/node/application.h index 065c898b4..5fbf82e4a 100644 --- a/src/node/application.h +++ b/src/node/application.h @@ -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 diff --git a/src/node/capability.cc b/src/node/capability.cc index 5f026832d..2c93db6f0 100644 --- a/src/node/capability.cc +++ b/src/node/capability.cc @@ -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 diff --git a/src/node/capability.h b/src/node/capability.h index d0f25aaee..c987682ba 100644 --- a/src/node/capability.h +++ b/src/node/capability.h @@ -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 diff --git a/src/node/onoff-application.cc b/src/node/onoff-application.cc index e668dcdce..aa7047d18 100644 --- a/src/node/onoff-application.cc +++ b/src/node/onoff-application.cc @@ -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 diff --git a/src/node/onoff-application.h b/src/node/onoff-application.h index e7ea44f3e..c00208132 100644 --- a/src/node/onoff-application.h +++ b/src/node/onoff-application.h @@ -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