merge with HEAD
This commit is contained in:
@@ -41,7 +41,7 @@ CommandLine::Item::~Item ()
|
||||
{}
|
||||
|
||||
void
|
||||
CommandLine::Parse (int &iargc, char *argv[]) const
|
||||
CommandLine::Parse (int iargc, char *argv[]) const
|
||||
{
|
||||
int argc = iargc;
|
||||
for (argc--, argv++; argc > 0; argc--, argv++)
|
||||
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
* Obviously, this method will parse the input command-line arguments and
|
||||
* will attempt to handle them all.
|
||||
*/
|
||||
void Parse (int &argc, char *argv[]) const;
|
||||
void Parse (int argc, char *argv[]) const;
|
||||
private:
|
||||
class Item
|
||||
{
|
||||
|
||||
@@ -399,6 +399,7 @@ DcaTxop::NotifyAccessGranted (void)
|
||||
m_currentPacket = 0;
|
||||
m_dcf->ResetCw ();
|
||||
m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
|
||||
StartAccessIfNeeded ();
|
||||
MY_DEBUG ("tx broadcast");
|
||||
}
|
||||
else
|
||||
|
||||
@@ -108,6 +108,11 @@ ArpL3Protocol::Receive(Ptr<NetDevice> device, Ptr<Packet> packet, uint16_t proto
|
||||
arp.GetDestinationIpv4Address () << "; we have address " <<
|
||||
cache->GetInterface ()->GetAddress ());
|
||||
|
||||
/**
|
||||
* Note: we do not update the ARP cache when we receive an ARP request
|
||||
* from an unknown node. See bug #107
|
||||
*/
|
||||
|
||||
if (arp.IsRequest () &&
|
||||
arp.GetDestinationIpv4Address () == cache->GetInterface ()->GetAddress ())
|
||||
{
|
||||
|
||||
@@ -681,6 +681,7 @@ bool TcpSocket::ProcessPacketAction (Actions_t a, Ptr<Packet> p,
|
||||
// TCP SYN consumes one byte
|
||||
m_nextRxSequence = tcpHeader.GetSequenceNumber() + SequenceNumber(1);
|
||||
m_nextTxSequence = tcpHeader.GetAckNumber ();
|
||||
m_firstPendingSequence = m_nextTxSequence; //bug 166
|
||||
NS_LOG_DEBUG ("TcpSocket " << this << " ACK_TX_1" <<
|
||||
" nextRxSeq " << m_nextRxSequence);
|
||||
SendEmptyPacket (TcpHeader::ACK);
|
||||
|
||||
@@ -295,14 +295,15 @@ UdpSocket::DoSendTo (Ptr<Packet> p, Ipv4Address dest, uint16_t port)
|
||||
NotifyDataSent (p->GetSize ());
|
||||
}
|
||||
NS_LOG_LOGIC ("Limited broadcast end.");
|
||||
return p->GetSize();
|
||||
}
|
||||
else if (ipv4->GetIfIndexForDestination(dest, localIfIndex))
|
||||
{
|
||||
NS_LOG_LOGIC ("Route exists");
|
||||
m_udp->Send (p, ipv4->GetAddress (localIfIndex), dest,
|
||||
m_udp->Send (p->Copy (), ipv4->GetAddress (localIfIndex), dest,
|
||||
m_endPoint->GetLocalPort (), port);
|
||||
NotifyDataSent (p->GetSize ());
|
||||
return 0;
|
||||
return p->GetSize();;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -471,7 +472,7 @@ UdpSocketTest::RunTests (void)
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("10.0.0.1"), 1234),
|
||||
Create<Packet> (123)), 0);
|
||||
Create<Packet> (123)), 123);
|
||||
Simulator::Run ();
|
||||
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
|
||||
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it
|
||||
@@ -482,7 +483,7 @@ UdpSocketTest::RunTests (void)
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
|
||||
Create<Packet> (123)), 0);
|
||||
Create<Packet> (123)), 123);
|
||||
Simulator::Run ();
|
||||
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
|
||||
// second socket should not receive it (it is bound specifically to the second interface's address
|
||||
@@ -502,7 +503,7 @@ UdpSocketTest::RunTests (void)
|
||||
m_receivedPacket = Create<Packet> ();
|
||||
m_receivedPacket2 = Create<Packet> ();
|
||||
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
|
||||
Create<Packet> (123)), 0);
|
||||
Create<Packet> (123)), 123);
|
||||
Simulator::Run ();
|
||||
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
|
||||
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123);
|
||||
|
||||
@@ -111,9 +111,10 @@ ATTRIBUTE_HELPER_CPP (Address);
|
||||
|
||||
bool operator == (const Address &a, const Address &b)
|
||||
{
|
||||
NS_ASSERT (a.m_type == b.m_type ||
|
||||
a.m_type == 0 ||
|
||||
b.m_type == 0);
|
||||
if (a.m_type != b.m_type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
NS_ASSERT (a.GetLength() == b.GetLength());
|
||||
return memcmp (a.m_data, b.m_data, a.m_len) == 0;
|
||||
}
|
||||
|
||||
@@ -572,12 +572,15 @@ AgentImpl::MprComputation()
|
||||
// (not in RFC but I think is needed: remove the 2-hop
|
||||
// neighbors reachable by the MPR from N2)
|
||||
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
|
||||
twoHopNeigh != N2.end (); twoHopNeigh++)
|
||||
twoHopNeigh != N2.end (); )
|
||||
{
|
||||
if (twoHopNeigh->neighborMainAddr == neighbor->neighborMainAddr)
|
||||
{
|
||||
twoHopNeigh = N2.erase (twoHopNeigh);
|
||||
twoHopNeigh--;
|
||||
}
|
||||
else
|
||||
{
|
||||
twoHopNeigh++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -617,12 +620,15 @@ AgentImpl::MprComputation()
|
||||
}
|
||||
// Remove the nodes from N2 which are now covered by a node in the MPR set.
|
||||
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
|
||||
twoHopNeigh != N2.end (); twoHopNeigh++)
|
||||
twoHopNeigh != N2.end (); )
|
||||
{
|
||||
if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
|
||||
{
|
||||
twoHopNeigh = N2.erase (twoHopNeigh);
|
||||
twoHopNeigh--;
|
||||
}
|
||||
else
|
||||
{
|
||||
twoHopNeigh++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -699,12 +705,15 @@ AgentImpl::MprComputation()
|
||||
{
|
||||
mprSet.insert (max->neighborMainAddr);
|
||||
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
|
||||
twoHopNeigh != N2.end (); twoHopNeigh++)
|
||||
twoHopNeigh != N2.end (); )
|
||||
{
|
||||
if (twoHopNeigh->neighborMainAddr == max->neighborMainAddr)
|
||||
{
|
||||
twoHopNeigh = N2.erase (twoHopNeigh);
|
||||
twoHopNeigh--;
|
||||
}
|
||||
else
|
||||
{
|
||||
twoHopNeigh++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,12 +64,15 @@ void
|
||||
OlsrState::EraseMprSelectorTuples (const Ipv4Address &mainAddr)
|
||||
{
|
||||
for (MprSelectorSet::iterator it = m_mprSelectorSet.begin ();
|
||||
it != m_mprSelectorSet.end (); it++)
|
||||
it != m_mprSelectorSet.end ();)
|
||||
{
|
||||
if (it->mainAddr == mainAddr)
|
||||
{
|
||||
it = m_mprSelectorSet.erase (it);
|
||||
it--;
|
||||
}
|
||||
else
|
||||
{
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -203,15 +206,18 @@ OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr,
|
||||
const Ipv4Address &twoHopNeighborAddr)
|
||||
{
|
||||
for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
|
||||
it != m_twoHopNeighborSet.end (); it++)
|
||||
it != m_twoHopNeighborSet.end ();)
|
||||
{
|
||||
if (it->neighborMainAddr == neighborMainAddr
|
||||
&& it->twoHopNeighborAddr == twoHopNeighborAddr)
|
||||
{
|
||||
it = m_twoHopNeighborSet.erase (it);
|
||||
it--; // FIXME: is this correct in the case 'it' pointed to the first element?
|
||||
m_modified = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,13 +225,17 @@ void
|
||||
OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr)
|
||||
{
|
||||
for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
|
||||
it != m_twoHopNeighborSet.end (); it++)
|
||||
it != m_twoHopNeighborSet.end ();)
|
||||
{
|
||||
if (it->neighborMainAddr == neighborMainAddr) {
|
||||
it = m_twoHopNeighborSet.erase (it);
|
||||
it--;
|
||||
m_modified = true;
|
||||
}
|
||||
if (it->neighborMainAddr == neighborMainAddr)
|
||||
{
|
||||
it = m_twoHopNeighborSet.erase (it);
|
||||
m_modified = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,14 +395,17 @@ void
|
||||
OlsrState::EraseOlderTopologyTuples (const Ipv4Address &lastAddr, uint16_t ansn)
|
||||
{
|
||||
for (TopologySet::iterator it = m_topologySet.begin();
|
||||
it != m_topologySet.end(); it++)
|
||||
it != m_topologySet.end();)
|
||||
{
|
||||
if (it->lastAddr == lastAddr && it->sequenceNumber < ansn)
|
||||
{
|
||||
it = m_topologySet.erase (it);
|
||||
it--;
|
||||
m_modified = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
it++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
* to move one if statement out of the loop.
|
||||
*/
|
||||
|
||||
#include "scheduler-heap.h"
|
||||
#include "heap-scheduler.h"
|
||||
#include "event-impl.h"
|
||||
#include "ns3/assert.h"
|
||||
|
||||
@@ -52,7 +52,7 @@ std::cout << "HEAP TRACE " << x << std::endl;
|
||||
namespace ns3 {
|
||||
|
||||
|
||||
SchedulerHeap::SchedulerHeap ()
|
||||
HeapScheduler::HeapScheduler ()
|
||||
{
|
||||
// we purposedly waste an item at the start of
|
||||
// the array to make sure the indexes in the
|
||||
@@ -61,57 +61,57 @@ SchedulerHeap::SchedulerHeap ()
|
||||
m_heap.push_back (std::make_pair (static_cast<EventImpl *>(0), emptyKey));
|
||||
}
|
||||
|
||||
SchedulerHeap::~SchedulerHeap ()
|
||||
HeapScheduler::~HeapScheduler ()
|
||||
{}
|
||||
|
||||
uint32_t
|
||||
SchedulerHeap::Parent (uint32_t id) const
|
||||
HeapScheduler::Parent (uint32_t id) const
|
||||
{
|
||||
return id / 2;
|
||||
}
|
||||
uint32_t
|
||||
SchedulerHeap::Sibling (uint32_t id) const
|
||||
HeapScheduler::Sibling (uint32_t id) const
|
||||
{
|
||||
return id + 1;
|
||||
}
|
||||
uint32_t
|
||||
SchedulerHeap::LeftChild (uint32_t id) const
|
||||
HeapScheduler::LeftChild (uint32_t id) const
|
||||
{
|
||||
return id * 2;
|
||||
}
|
||||
uint32_t
|
||||
SchedulerHeap::RightChild (uint32_t id) const
|
||||
HeapScheduler::RightChild (uint32_t id) const
|
||||
{
|
||||
return id * 2 + 1;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
SchedulerHeap::Root (void) const
|
||||
HeapScheduler::Root (void) const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerHeap::IsRoot (uint32_t id) const
|
||||
HeapScheduler::IsRoot (uint32_t id) const
|
||||
{
|
||||
return (id == Root ())?true:false;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
SchedulerHeap::Last (void) const
|
||||
HeapScheduler::Last (void) const
|
||||
{
|
||||
return m_heap.size () - 1;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
SchedulerHeap::IsBottom (uint32_t id) const
|
||||
HeapScheduler::IsBottom (uint32_t id) const
|
||||
{
|
||||
return (id >= m_heap.size ())?true:false;
|
||||
}
|
||||
|
||||
void
|
||||
SchedulerHeap::Exch (uint32_t a, uint32_t b)
|
||||
HeapScheduler::Exch (uint32_t a, uint32_t b)
|
||||
{
|
||||
NS_ASSERT (b < m_heap.size () && a < m_heap.size ());
|
||||
TRACE ("Exch " << a << ", " << b);
|
||||
@@ -121,7 +121,7 @@ SchedulerHeap::Exch (uint32_t a, uint32_t b)
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerHeap::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
|
||||
HeapScheduler::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
|
||||
{
|
||||
if (a->m_ts < b->m_ts)
|
||||
{
|
||||
@@ -142,25 +142,25 @@ SchedulerHeap::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerHeap::IsLessStrictly (uint32_t a, uint32_t b) const
|
||||
HeapScheduler::IsLessStrictly (uint32_t a, uint32_t b) const
|
||||
{
|
||||
return IsLowerStrictly (&m_heap[a].second, &m_heap[b].second);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
SchedulerHeap::Smallest (uint32_t a, uint32_t b) const
|
||||
HeapScheduler::Smallest (uint32_t a, uint32_t b) const
|
||||
{
|
||||
return IsLessStrictly (a,b)?a:b;
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerHeap::IsEmpty (void) const
|
||||
HeapScheduler::IsEmpty (void) const
|
||||
{
|
||||
return (m_heap.size () == 1)?true:false;
|
||||
}
|
||||
|
||||
void
|
||||
SchedulerHeap::BottomUp (void)
|
||||
HeapScheduler::BottomUp (void)
|
||||
{
|
||||
uint32_t index = Last ();
|
||||
while (!IsRoot (index) &&
|
||||
@@ -172,7 +172,7 @@ SchedulerHeap::BottomUp (void)
|
||||
}
|
||||
|
||||
void
|
||||
SchedulerHeap::TopDown (uint32_t start)
|
||||
HeapScheduler::TopDown (uint32_t start)
|
||||
{
|
||||
uint32_t index = start;
|
||||
uint32_t right = RightChild (index);
|
||||
@@ -207,7 +207,7 @@ SchedulerHeap::TopDown (uint32_t start)
|
||||
|
||||
|
||||
void
|
||||
SchedulerHeap::Insert (const EventId &id)
|
||||
HeapScheduler::Insert (const EventId &id)
|
||||
{
|
||||
// acquire single ref
|
||||
EventImpl *event = id.PeekEventImpl ();
|
||||
@@ -220,13 +220,13 @@ SchedulerHeap::Insert (const EventId &id)
|
||||
}
|
||||
|
||||
EventId
|
||||
SchedulerHeap::PeekNext (void) const
|
||||
HeapScheduler::PeekNext (void) const
|
||||
{
|
||||
std::pair<EventImpl *,Scheduler::EventKey> next = m_heap[Root ()];
|
||||
return EventId (next.first, next.second.m_ts, next.second.m_uid);
|
||||
}
|
||||
EventId
|
||||
SchedulerHeap::RemoveNext (void)
|
||||
HeapScheduler::RemoveNext (void)
|
||||
{
|
||||
std::pair<EventImpl *,Scheduler::EventKey> next = m_heap[Root ()];
|
||||
Exch (Root (), Last ());
|
||||
@@ -237,7 +237,7 @@ SchedulerHeap::RemoveNext (void)
|
||||
|
||||
|
||||
bool
|
||||
SchedulerHeap::Remove (const EventId &id)
|
||||
HeapScheduler::Remove (const EventId &id)
|
||||
{
|
||||
uint32_t uid = id.GetUid ();
|
||||
for (uint32_t i = 1; i < m_heap.size (); i++)
|
||||
@@ -29,10 +29,10 @@ namespace ns3 {
|
||||
|
||||
class EventHolder;
|
||||
|
||||
class SchedulerHeap : public Scheduler {
|
||||
class HeapScheduler : public Scheduler {
|
||||
public:
|
||||
SchedulerHeap ();
|
||||
virtual ~SchedulerHeap ();
|
||||
HeapScheduler ();
|
||||
virtual ~HeapScheduler ();
|
||||
|
||||
virtual void Insert (const EventId &id);
|
||||
virtual bool IsEmpty (void) const;
|
||||
@@ -18,7 +18,7 @@
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
|
||||
#include "scheduler-list.h"
|
||||
#include "list-scheduler.h"
|
||||
#include "event-impl.h"
|
||||
#include <utility>
|
||||
#include <string>
|
||||
@@ -27,13 +27,13 @@
|
||||
namespace ns3 {
|
||||
|
||||
|
||||
SchedulerList::SchedulerList ()
|
||||
ListScheduler::ListScheduler ()
|
||||
{}
|
||||
SchedulerList::~SchedulerList ()
|
||||
ListScheduler::~ListScheduler ()
|
||||
{}
|
||||
|
||||
bool
|
||||
SchedulerList::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
|
||||
ListScheduler::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
|
||||
{
|
||||
if (a->m_ts < b->m_ts)
|
||||
{
|
||||
@@ -51,7 +51,7 @@ SchedulerList::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b
|
||||
}
|
||||
|
||||
void
|
||||
SchedulerList::Insert (const EventId &id)
|
||||
ListScheduler::Insert (const EventId &id)
|
||||
{
|
||||
Scheduler::EventKey key;
|
||||
// acquire refcount on EventImpl
|
||||
@@ -70,19 +70,19 @@ SchedulerList::Insert (const EventId &id)
|
||||
m_events.push_back (std::make_pair (event, key));
|
||||
}
|
||||
bool
|
||||
SchedulerList::IsEmpty (void) const
|
||||
ListScheduler::IsEmpty (void) const
|
||||
{
|
||||
return m_events.empty ();
|
||||
}
|
||||
EventId
|
||||
SchedulerList::PeekNext (void) const
|
||||
ListScheduler::PeekNext (void) const
|
||||
{
|
||||
std::pair<EventImpl *, EventKey> next = m_events.front ();
|
||||
return EventId (next.first, next.second.m_ts, next.second.m_uid);
|
||||
}
|
||||
|
||||
EventId
|
||||
SchedulerList::RemoveNext (void)
|
||||
ListScheduler::RemoveNext (void)
|
||||
{
|
||||
std::pair<EventImpl *, EventKey> next = m_events.front ();
|
||||
m_events.pop_front ();
|
||||
@@ -90,7 +90,7 @@ SchedulerList::RemoveNext (void)
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerList::Remove (const EventId &id)
|
||||
ListScheduler::Remove (const EventId &id)
|
||||
{
|
||||
for (EventsI i = m_events.begin (); i != m_events.end (); i++)
|
||||
{
|
||||
@@ -31,10 +31,10 @@ namespace ns3 {
|
||||
|
||||
class EventImpl;
|
||||
|
||||
class SchedulerList : public Scheduler {
|
||||
class ListScheduler : public Scheduler {
|
||||
public:
|
||||
SchedulerList ();
|
||||
virtual ~SchedulerList ();
|
||||
ListScheduler ();
|
||||
virtual ~ListScheduler ();
|
||||
|
||||
virtual void Insert (const EventId &id);
|
||||
virtual bool IsEmpty (void) const;
|
||||
@@ -19,7 +19,7 @@
|
||||
* The idea to use a std c++ map came from GTNetS
|
||||
*/
|
||||
|
||||
#include "scheduler-map.h"
|
||||
#include "map-scheduler.h"
|
||||
#include "event-impl.h"
|
||||
#include "ns3/assert.h"
|
||||
#include <string>
|
||||
@@ -37,9 +37,9 @@ std::cout << "MAP TRACE " << x << std::endl;
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
SchedulerMap::SchedulerMap ()
|
||||
MapScheduler::MapScheduler ()
|
||||
{}
|
||||
SchedulerMap::~SchedulerMap ()
|
||||
MapScheduler::~MapScheduler ()
|
||||
{}
|
||||
|
||||
/* Note the invariants which this function must provide:
|
||||
@@ -48,7 +48,7 @@ SchedulerMap::~SchedulerMap ()
|
||||
* - transitivity: f(x,y) and f(y,z) => f(x,z)
|
||||
*/
|
||||
bool
|
||||
SchedulerMap::EventKeyCompare::operator () (struct EventKey const&a, struct EventKey const&b)
|
||||
MapScheduler::EventKeyCompare::operator () (struct EventKey const&a, struct EventKey const&b)
|
||||
{
|
||||
if (a.m_ts < b.m_ts)
|
||||
{
|
||||
@@ -71,7 +71,7 @@ SchedulerMap::EventKeyCompare::operator () (struct EventKey const&a, struct Even
|
||||
|
||||
|
||||
void
|
||||
SchedulerMap::Insert (const EventId &id)
|
||||
MapScheduler::Insert (const EventId &id)
|
||||
{
|
||||
// acquire a single ref
|
||||
EventImpl *event = id.PeekEventImpl ();
|
||||
@@ -85,13 +85,13 @@ SchedulerMap::Insert (const EventId &id)
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerMap::IsEmpty (void) const
|
||||
MapScheduler::IsEmpty (void) const
|
||||
{
|
||||
return m_list.empty ();
|
||||
}
|
||||
|
||||
EventId
|
||||
SchedulerMap::PeekNext (void) const
|
||||
MapScheduler::PeekNext (void) const
|
||||
{
|
||||
EventMapCI i = m_list.begin ();
|
||||
NS_ASSERT (i != m_list.end ());
|
||||
@@ -99,7 +99,7 @@ SchedulerMap::PeekNext (void) const
|
||||
return EventId (i->second, i->first.m_ts, i->first.m_uid);
|
||||
}
|
||||
EventId
|
||||
SchedulerMap::RemoveNext (void)
|
||||
MapScheduler::RemoveNext (void)
|
||||
{
|
||||
EventMapI i = m_list.begin ();
|
||||
std::pair<Scheduler::EventKey, EventImpl*> next = *i;
|
||||
@@ -108,7 +108,7 @@ SchedulerMap::RemoveNext (void)
|
||||
}
|
||||
|
||||
bool
|
||||
SchedulerMap::Remove (const EventId &id)
|
||||
MapScheduler::Remove (const EventId &id)
|
||||
{
|
||||
Scheduler::EventKey key;
|
||||
key.m_ts = id.GetTs ();
|
||||
@@ -30,10 +30,10 @@ namespace ns3 {
|
||||
|
||||
class EventImpl;
|
||||
|
||||
class SchedulerMap : public Scheduler {
|
||||
class MapScheduler : public Scheduler {
|
||||
public:
|
||||
SchedulerMap ();
|
||||
virtual ~SchedulerMap ();
|
||||
MapScheduler ();
|
||||
virtual ~MapScheduler ();
|
||||
|
||||
virtual void Insert (const EventId &id);
|
||||
virtual bool IsEmpty (void) const;
|
||||
@@ -47,9 +47,9 @@ private:
|
||||
bool operator () (struct EventKey const&a, struct EventKey const&b);
|
||||
};
|
||||
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare> EventMap;
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare>::iterator EventMapI;
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare>::const_iterator EventMapCI;
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare> EventMap;
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare>::iterator EventMapI;
|
||||
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare>::const_iterator EventMapCI;
|
||||
|
||||
|
||||
EventMap m_list;
|
||||
@@ -274,6 +274,7 @@ TimeUnit<N1+N2> operator * (TimeUnit<N1> const &lhs, TimeUnit<N2> const &rhs)
|
||||
template <int N1, int N2>
|
||||
TimeUnit<N1-N2> operator / (TimeUnit<N1> const &lhs, TimeUnit<N2> const &rhs)
|
||||
{
|
||||
NS_ASSERT (rhs.GetHighPrecision ().GetDouble () != 0);
|
||||
HighPrecision retval = lhs.GetHighPrecision ();
|
||||
retval.Div (rhs.GetHighPrecision ());
|
||||
return TimeUnit<N1-N2> (retval);
|
||||
|
||||
@@ -393,9 +393,7 @@ SimulatorPrivate::GetMaximumSimulationTime (void) const
|
||||
}; // namespace ns3
|
||||
|
||||
|
||||
#include "scheduler-list.h"
|
||||
#include "scheduler-heap.h"
|
||||
#include "scheduler-map.h"
|
||||
#include "map-scheduler.h"
|
||||
|
||||
|
||||
namespace ns3 {
|
||||
@@ -426,7 +424,7 @@ Simulator::GetPriv (void)
|
||||
{
|
||||
LogRegisterTimePrinter (&TimePrinter);
|
||||
m_priv = CreateObject<SimulatorPrivate> ();
|
||||
Ptr<Scheduler> scheduler = CreateObject<SchedulerMap> ();
|
||||
Ptr<Scheduler> scheduler = CreateObject<MapScheduler> ();
|
||||
m_priv->SetScheduler (scheduler);
|
||||
}
|
||||
TRACE_S ("priv " << m_priv);
|
||||
@@ -572,6 +570,8 @@ Simulator::GetMaximumSimulationTime (void)
|
||||
|
||||
#include "ns3/test.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "list-scheduler.h"
|
||||
#include "heap-scheduler.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -942,19 +942,19 @@ SimulatorTests::RunTests (void)
|
||||
bool result = true;
|
||||
|
||||
Simulator::Destroy ();
|
||||
Simulator::SetScheduler (CreateObject<SchedulerList> ());
|
||||
Simulator::SetScheduler (CreateObject<ListScheduler> ());
|
||||
if (!RunOneTest ())
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
Simulator::Destroy ();
|
||||
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
|
||||
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
|
||||
if (!RunOneTest ())
|
||||
{
|
||||
result = false;
|
||||
}
|
||||
Simulator::Destroy ();
|
||||
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
|
||||
Simulator::SetScheduler (CreateObject<MapScheduler> ());
|
||||
if (!RunOneTest ())
|
||||
{
|
||||
result = false;
|
||||
|
||||
@@ -53,9 +53,9 @@ def build(bld):
|
||||
'time.cc',
|
||||
'event-id.cc',
|
||||
'scheduler.cc',
|
||||
'scheduler-list.cc',
|
||||
'scheduler-heap.cc',
|
||||
'scheduler-map.cc',
|
||||
'list-scheduler.cc',
|
||||
'map-scheduler.cc',
|
||||
'heap-scheduler.cc',
|
||||
'event-impl.cc',
|
||||
'simulator.cc',
|
||||
'timer.cc',
|
||||
@@ -71,9 +71,9 @@ def build(bld):
|
||||
'event-impl.h',
|
||||
'simulator.h',
|
||||
'scheduler.h',
|
||||
'scheduler-list.h',
|
||||
'scheduler-map.h',
|
||||
'scheduler-heap.h',
|
||||
'list-scheduler.h',
|
||||
'map-scheduler.h',
|
||||
'heap-scheduler.h',
|
||||
'simulation-singleton.h',
|
||||
'timer.h',
|
||||
'timer-impl.h',
|
||||
|
||||
@@ -18,11 +18,8 @@
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/scheduler-list.h"
|
||||
#include "ns3/scheduler-map.h"
|
||||
#include "ns3/scheduler-heap.h"
|
||||
#include "ns3/system-wall-clock-ms.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
#include "ns3/core-module.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
@@ -161,15 +158,15 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
if (strcmp ("--list", argv[0]) == 0)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerList> ());
|
||||
Simulator::SetScheduler (CreateObject<ListScheduler> ());
|
||||
}
|
||||
else if (strcmp ("--heap", argv[0]) == 0)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
|
||||
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
|
||||
}
|
||||
else if (strcmp ("--map", argv[0]) == 0)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
|
||||
Simulator::SetScheduler (CreateObject<MapScheduler> ());
|
||||
}
|
||||
else if (strcmp ("--debug", argv[0]) == 0)
|
||||
{
|
||||
|
||||
@@ -18,12 +18,8 @@
|
||||
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
||||
*/
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/scheduler-list.h"
|
||||
#include "ns3/scheduler-map.h"
|
||||
#include "ns3/scheduler-heap.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/system-wall-clock-ms.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
#include "ns3/core-module.h"
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include <fstream>
|
||||
@@ -317,15 +313,15 @@ int main (int argc, char *argv[])
|
||||
{
|
||||
if (is_map)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
|
||||
Simulator::SetScheduler (CreateObject<MapScheduler> ());
|
||||
}
|
||||
else if (is_list)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerList> ());
|
||||
Simulator::SetScheduler (CreateObject<ListScheduler> ());
|
||||
}
|
||||
else if (is_heap)
|
||||
{
|
||||
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
|
||||
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
|
||||
}
|
||||
log.Run ();
|
||||
Simulator::Destroy ();
|
||||
|
||||
Reference in New Issue
Block a user