From 46a0667585e092634e7fe5fa967aedbea68e3410 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 14 Jan 2009 11:17:41 +0000 Subject: [PATCH 01/23] Add dependency annotations for the task that generates Python bindings --- bindings/python/wscript | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bindings/python/wscript b/bindings/python/wscript index 794334f7d..7b3181b98 100644 --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -484,7 +484,8 @@ def build(bld): bindgen = bld.new_task_gen('command', source=source, target=target, command=argv, variables=dict(FEATURES=(','.join(features)))) - + bindgen.before = 'cxx' + bindgen.after = 'gen_everything_h_task' ## we build python bindings if either we have the tools to ## generate them or if the pregenerated source file is already From edd1e2552a906fae51b5d28a71429dcaebadff64 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 14 Jan 2009 12:46:06 +0000 Subject: [PATCH 02/23] Correct documentation --- src/simulator/simulator.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/simulator/simulator.h b/src/simulator/simulator.h index d0d66a9c4..a0732fb53 100644 --- a/src/simulator/simulator.h +++ b/src/simulator/simulator.h @@ -97,8 +97,8 @@ public: static void Destroy (void); /** - * If there any any events lefts to be scheduled and simulation time - * has not yet reached the "stop time" (see Simulator::Stop()), + * If there are no more events lefts to be scheduled, or if simulation + * time has already reached the "stop time" (see Simulator::Stop()), * return true. Return false otherwise. */ static bool IsFinished (void); From f116668736c207aa6333ad0ee5accb42a95555ed Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 14 Jan 2009 15:35:42 +0000 Subject: [PATCH 03/23] RealtimeEventLock is gone --- bindings/python/ns3modulegen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bindings/python/ns3modulegen.py b/bindings/python/ns3modulegen.py index c38185f95..21f9e72d9 100755 --- a/bindings/python/ns3modulegen.py +++ b/bindings/python/ns3modulegen.py @@ -137,7 +137,7 @@ def main(): root_module.classes.remove(root_module['ns3::%s' % clsname]) if 'RealTime' not in enabled_features: - for clsname in ['WallClockSynchronizer', 'RealtimeSimulatorImpl', 'RealtimeEventLock']: + for clsname in ['WallClockSynchronizer', 'RealtimeSimulatorImpl']: root_module.classes.remove(root_module['ns3::%s' % clsname]) root_module.enums.remove(root_module['ns3::RealtimeSimulatorImpl::SynchronizationMode']) From 8d8d19ef45d611c9e67c8fcf69ef33b98e4a7768 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Wed, 14 Jan 2009 15:36:19 +0000 Subject: [PATCH 04/23] Fix build for systems without posix threads library --- samples/wscript | 5 +++-- src/simulator/simulator.cc | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/samples/wscript b/samples/wscript index d1c1e8fa1..5286f56c9 100644 --- a/samples/wscript +++ b/samples/wscript @@ -19,8 +19,9 @@ def build(bld): obj = bld.create_ns3_program('main-test') obj.source = 'main-test.cc' - obj = bld.create_ns3_program('main-test-sync') - obj.source = 'main-test-sync.cc' + if bld.env['ENABLE_THREADING']: + obj = bld.create_ns3_program('main-test-sync') + obj.source = 'main-test-sync.cc' obj = bld.create_ns3_program('main-simple', ['node', 'internet-stack', 'onoff']) diff --git a/src/simulator/simulator.cc b/src/simulator/simulator.cc index efd1c80bc..a61801175 100644 --- a/src/simulator/simulator.cc +++ b/src/simulator/simulator.cc @@ -17,11 +17,13 @@ * * Author: Mathieu Lacage */ - +#include "ns3/core-config.h" #include "simulator.h" #include "simulator-impl.h" #include "default-simulator-impl.h" -#include "realtime-simulator-impl.h" +#ifdef HAVE_PTHREAD_H +# include "realtime-simulator-impl.h" +#endif #include "scheduler.h" #include "event-impl.h" From 05437e76a9426145e974916bfdba1fb77b0c2723 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 15 Jan 2009 11:23:59 +0100 Subject: [PATCH 05/23] empty skeleton for ns2 calendar scheduler --- src/simulator/ns2-calendar-scheduler.cc | 70 +++++++++++++++++++++++++ src/simulator/ns2-calendar-scheduler.h | 60 +++++++++++++++++++++ src/simulator/wscript | 2 + 3 files changed, 132 insertions(+) create mode 100644 src/simulator/ns2-calendar-scheduler.cc create mode 100644 src/simulator/ns2-calendar-scheduler.h diff --git a/src/simulator/ns2-calendar-scheduler.cc b/src/simulator/ns2-calendar-scheduler.cc new file mode 100644 index 000000000..a765ea64c --- /dev/null +++ b/src/simulator/ns2-calendar-scheduler.cc @@ -0,0 +1,70 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * XXXX + */ + +#include "ns2-calendar-scheduler.h" +#include "event-impl.h" +#include +#include +#include +#include "ns3/assert.h" +#include "ns3/log.h" + +namespace ns3 { + +NS_LOG_COMPONENT_DEFINE ("Ns2CalendarScheduler"); + +NS_OBJECT_ENSURE_REGISTERED (Ns2CalendarScheduler); + +TypeId +Ns2CalendarScheduler::GetTypeId (void) +{ + static TypeId tid = TypeId ("ns3::Ns2CalendarScheduler") + .SetParent () + .AddConstructor () + ; + return tid; +} + +Ns2CalendarScheduler::Ns2CalendarScheduler () +{ + NS_LOG_FUNCTION (this); +} +Ns2CalendarScheduler::~Ns2CalendarScheduler () +{ + NS_LOG_FUNCTION (this); +} +void +Ns2CalendarScheduler::Insert (const Event &ev) +{ + NS_LOG_FUNCTION (this); +} +bool +Ns2CalendarScheduler::IsEmpty (void) const +{ + return false; +} +Scheduler::Event +Ns2CalendarScheduler::PeekNext (void) const +{ + NS_LOG_FUNCTION (this); + return Scheduler::Event (); +} + + +Scheduler::Event +Ns2CalendarScheduler::RemoveNext (void) +{ + NS_LOG_FUNCTION (this); + return Scheduler::Event (); +} + +void +Ns2CalendarScheduler::Remove (const Event &ev) +{ + NS_ASSERT (!IsEmpty ()); + NS_ASSERT (false); +} + +} // namespace ns3 diff --git a/src/simulator/ns2-calendar-scheduler.h b/src/simulator/ns2-calendar-scheduler.h new file mode 100644 index 000000000..88fbeae6a --- /dev/null +++ b/src/simulator/ns2-calendar-scheduler.h @@ -0,0 +1,60 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 1994 Regents of the University of California. + * Copyright (c) 2009 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Authors: + * David Wetherall : originally, in ns-2, back in 1997, + * Mathieu Lacage : port to ns-3 + */ + +#ifndef NS2_CALENDAR_SCHEDULER_H +#define NS2_CALENDAR_SCHEDULER_H + +#include "scheduler.h" +#include +#include + +namespace ns3 { + +class EventImpl; + +/** + * \ingroup scheduler + * \brief a calendar queue event scheduler + * + * This event scheduler is a copy/paste of the ns2.29 calendar scheduler. + */ +class Ns2CalendarScheduler : public Scheduler +{ +public: + static TypeId GetTypeId (void); + + Ns2CalendarScheduler (); + virtual ~Ns2CalendarScheduler (); + + virtual void Insert (const Event &ev); + virtual bool IsEmpty (void) const; + virtual Event PeekNext (void) const; + virtual Event RemoveNext (void); + virtual void Remove (const Event &ev); + +private: +}; + +} // namespace ns3 + +#endif /* NS2_CALENDAR_SCHEDULER_H */ diff --git a/src/simulator/wscript b/src/simulator/wscript index f4bd1145a..1824bd486 100644 --- a/src/simulator/wscript +++ b/src/simulator/wscript @@ -49,6 +49,7 @@ def build(bld): 'map-scheduler.cc', 'heap-scheduler.cc', 'calendar-scheduler.cc', + 'ns2-calendar-scheduler.cc', 'event-impl.cc', 'simulator.cc', 'default-simulator-impl.cc', @@ -73,6 +74,7 @@ def build(bld): 'map-scheduler.h', 'heap-scheduler.h', 'calendar-scheduler.h', + 'ns2-calendar-scheduler.h', 'simulation-singleton.h', 'timer.h', 'timer-impl.h', From f232747976851ba6705ba828fb11521e67833715 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 15 Jan 2009 20:53:50 +0100 Subject: [PATCH 06/23] memleak --- src/simulator/calendar-scheduler.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/simulator/calendar-scheduler.cc b/src/simulator/calendar-scheduler.cc index 904ecfcf2..a1ff087d0 100644 --- a/src/simulator/calendar-scheduler.cc +++ b/src/simulator/calendar-scheduler.cc @@ -331,6 +331,7 @@ CalendarScheduler::DoResize (uint32_t newSize, uint32_t newWidth) DoInsert (*j); } } + delete [] oldBuckets; } void CalendarScheduler::Resize (uint32_t newSize) From e4e6eb1ab0cb7528d07c310c4ca8efaa5cf556df Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 15 Jan 2009 20:54:11 +0100 Subject: [PATCH 07/23] add new comparison operators. --- src/simulator/scheduler.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/simulator/scheduler.h b/src/simulator/scheduler.h index 72331baba..394987f7c 100644 --- a/src/simulator/scheduler.h +++ b/src/simulator/scheduler.h @@ -115,6 +115,28 @@ inline bool operator < (const Scheduler::EventKey &a, const Scheduler::EventKey return false; } } +inline bool operator != (const Scheduler::EventKey &a, const Scheduler::EventKey &b) +{ + return a.m_uid != b.m_uid; +} +inline bool operator > (const Scheduler::EventKey &a, const Scheduler::EventKey &b) +{ + if (a.m_ts > b.m_ts) + { + return true; + } + else if (a.m_ts == b.m_ts && + a.m_uid > b.m_uid) + { + return true; + } + else + { + return false; + } +} + + inline bool operator < (const Scheduler::Event &a, const Scheduler::Event &b) { From 14fdfbf4b2c6c15aa8a37e2ba9beb7e2ef14a25d Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 15 Jan 2009 20:55:34 +0100 Subject: [PATCH 08/23] test calendar+ns2calendar schedulers --- src/simulator/simulator.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/simulator/simulator.cc b/src/simulator/simulator.cc index a61801175..0eae117b1 100644 --- a/src/simulator/simulator.cc +++ b/src/simulator/simulator.cc @@ -316,6 +316,8 @@ Simulator::GetImplementation (void) #include "list-scheduler.h" #include "heap-scheduler.h" #include "map-scheduler.h" +#include "calendar-scheduler.h" +#include "ns2-calendar-scheduler.h" namespace ns3 { @@ -742,6 +744,20 @@ SimulatorTests::RunTests (void) } Simulator::Destroy (); + Simulator::SetScheduler (CreateObject ()); + if (!RunOneTest ()) + { + result = false; + } + Simulator::Destroy (); + + Simulator::SetScheduler (CreateObject ()); + if (!RunOneTest ()) + { + result = false; + } + Simulator::Destroy (); + Simulator::Schedule (Seconds (0.0), &foo0); Simulator::Schedule (Seconds (0.0), &foo1, 0); Simulator::Schedule (Seconds (0.0), &foo2, 0, 0); From 7604c76fd4315554d7bcffb80f9477998e0cf116 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Thu, 15 Jan 2009 20:56:06 +0100 Subject: [PATCH 09/23] ns-2 calendar code --- src/simulator/ns2-calendar-scheduler.cc | 450 ++++++++++++++++++++++-- src/simulator/ns2-calendar-scheduler.h | 57 ++- 2 files changed, 470 insertions(+), 37 deletions(-) diff --git a/src/simulator/ns2-calendar-scheduler.cc b/src/simulator/ns2-calendar-scheduler.cc index a765ea64c..f3f00028b 100644 --- a/src/simulator/ns2-calendar-scheduler.cc +++ b/src/simulator/ns2-calendar-scheduler.cc @@ -1,15 +1,14 @@ -/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* -*- Mode:C++; c-basic-offset:8; tab-width:8; -*- */ /* * XXXX */ #include "ns2-calendar-scheduler.h" #include "event-impl.h" -#include -#include -#include #include "ns3/assert.h" #include "ns3/log.h" +#include +#include namespace ns3 { @@ -17,54 +16,465 @@ NS_LOG_COMPONENT_DEFINE ("Ns2CalendarScheduler"); NS_OBJECT_ENSURE_REGISTERED (Ns2CalendarScheduler); +#define CALENDAR_HASH(key) ((key.m_ts / width_) % nbuckets_) + TypeId Ns2CalendarScheduler::GetTypeId (void) { - static TypeId tid = TypeId ("ns3::Ns2CalendarScheduler") - .SetParent () - .AddConstructor () - ; - return tid; + static TypeId tid = TypeId ("ns3::Ns2CalendarScheduler") + .SetParent () + .AddConstructor () + ; + return tid; } Ns2CalendarScheduler::Ns2CalendarScheduler () { - NS_LOG_FUNCTION (this); + NS_LOG_FUNCTION (this); + + adjust_new_width_interval_ = 10; + min_bin_width_ = 1; + avg_gap_ = -2; + last_time_ = 0; + gap_num_ = 0; + head_search_ = 0; + insert_search_ = 0; + round_num_ = 0; + time_to_newwidth_ = adjust_new_width_interval_; + cal_clock_ = Scheduler::EventKey (); + reinit(4, 1.0, cal_clock_); } Ns2CalendarScheduler::~Ns2CalendarScheduler () { - NS_LOG_FUNCTION (this); + NS_LOG_FUNCTION (this); + + for (int i = 0; i < nbuckets_; i++) { + Bucket *bucket = &buckets_[i]; + if (bucket->list_ == 0) { + continue; + } + if (bucket->list_->next_ == bucket->list_) { + delete bucket->list_; + continue; + } + BucketItem *next; + BucketItem *cur; + for (cur = bucket->list_; + cur->next_ != bucket->list_; + cur = next) { + next = cur->next_; + delete cur; + } + delete cur; + } + delete [] buckets_; + qsize_ = 0; + stat_qsize_ = 0; } void -Ns2CalendarScheduler::Insert (const Event &ev) +Ns2CalendarScheduler::Insert (const Event &event) { - NS_LOG_FUNCTION (this); + NS_LOG_FUNCTION (this); + + Scheduler::EventKey newtime = event.key; + int i = CALENDAR_HASH(newtime); + + Bucket* current=(&buckets_[i]); + BucketItem *head = current->list_; + BucketItem *after=0; + BucketItem *e = new BucketItem (); + e->event = event; + + if (!head) { + current->list_ = e; + e->next_ = e->prev_ = e; + ++stat_qsize_; + ++(current->count_); + } else { + insert_search_++; + if (newtime < head->event.key) { + // e-> head -> ... + e->next_ = head; + e->prev_ = head->prev_; + e->prev_->next_ = e; + head->prev_ = e; + current->list_ = e; + ++stat_qsize_; + ++(current->count_); + } else { + for (after = head->prev_; newtime < after->event.key; after = after->prev_) + { insert_search_++; }; + //...-> after -> e -> ... + e->next_ = after->next_; + e->prev_ = after; + e->next_->prev_ = e; + after->next_ = e; + if (after->event.key < newtime) { + //unique timing + ++stat_qsize_; + ++(current->count_); + } + } + } + ++qsize_; + //assert(e == buckets_[i].list_ || e->prev_->time_ <= e->time_); + //assert(e == buckets_[i].list_->prev_ || e->next_->time_ >= e->time_); + + if (stat_qsize_ > top_threshold_) { + resize(nbuckets_ << 1, cal_clock_); + return; + } } bool Ns2CalendarScheduler::IsEmpty (void) const { - return false; + return qsize_ == 0; } Scheduler::Event Ns2CalendarScheduler::PeekNext (void) const { - NS_LOG_FUNCTION (this); - return Scheduler::Event (); + NS_LOG_FUNCTION (this); + NS_ASSERT (!IsEmpty ()); + + BucketItem *e = const_cast (this)->head (); + NS_ASSERT (e != 0); + + return e->event; } Scheduler::Event Ns2CalendarScheduler::RemoveNext (void) { - NS_LOG_FUNCTION (this); - return Scheduler::Event (); + NS_LOG_FUNCTION (this); + NS_ASSERT (!IsEmpty ()); + + BucketItem *e = head (); + NS_ASSERT (e != 0); + + if (last_time_ == 0) last_time_ = e->event.key.m_ts; + else + { + gap_num_ ++; + if (gap_num_ >= qsize_ ) { + uint64_t tt_gap_ = e->event.key.m_ts - last_time_; + avg_gap_ = tt_gap_ / gap_num_; + gap_num_ = 0; + last_time_ = e->event.key.m_ts; + round_num_ ++; + if ((round_num_ > 20) && + (( head_search_> (insert_search_<<1)) + ||( insert_search_> (head_search_<<1)) )) + { + resize(nbuckets_, cal_clock_); + round_num_ = 0; + } else { + if (round_num_ > 100) { + round_num_ = 0; + head_search_ = 0; + insert_search_ = 0; + } + } + } + } + + int l = lastbucket_; + + // update stats and unlink + if (e->next_ == e || e->next_->event.key != e->event.key) { + --stat_qsize_; + //assert(stat_qsize_ >= 0); + --buckets_[l].count_; + //assert(buckets_[l].count_ >= 0); + } + --qsize_; + + if (e->next_ == e) + buckets_[l].list_ = 0; + else { + e->next_->prev_ = e->prev_; + e->prev_->next_ = e->next_; + buckets_[l].list_ = e->next_; + } + + e->next_ = e->prev_ = NULL; + + + //if (buckets_[l].count_ == 0) + // assert(buckets_[l].list_ == 0); + + if (stat_qsize_ < bot_threshold_) { + resize(nbuckets_ >> 1, cal_clock_); + } + + Scheduler::Event event = e->event; + delete e; + return event; } void Ns2CalendarScheduler::Remove (const Event &ev) { - NS_ASSERT (!IsEmpty ()); - NS_ASSERT (false); + NS_ASSERT (!IsEmpty ()); + + + int i = CALENDAR_HASH(ev.key); + + Bucket* current=(&buckets_[i]); + BucketItem *head = current->list_; + BucketItem *e=0; + + if (!head) { + NS_LOG_DEBUG ("event not in scheduler"); + return; + } + for (e = head->prev_; ev.key != e->event.key; e = e->prev_) {} + --stat_qsize_; + --buckets_[i].count_; + if (e->next_ == e) { + assert(buckets_[i].list_ == e); + buckets_[i].list_ = 0; + } else { + e->next_->prev_ = e->prev_; + e->prev_->next_ = e->next_; + if (buckets_[i].list_ == e) + buckets_[i].list_ = e->next_; + } + + if (buckets_[i].count_ == 0) + assert(buckets_[i].list_ == 0); + + e->next_ = e->prev_ = NULL; + + delete e; + + --qsize_; + + return; } +Ns2CalendarScheduler::BucketItem * +Ns2CalendarScheduler::head (void) +{ + NS_ASSERT (!IsEmpty ()); + + int l = -1, i = lastbucket_; + int lastbucket_dec = (lastbucket_) ? lastbucket_ - 1 : nbuckets_ - 1; + uint64_t diff; + BucketItem *e, *min_e = NULL; +#define CAL_DEQUEUE(x) \ +do { \ + head_search_++; \ + if ((e = buckets_[i].list_) != NULL) { \ + diff = e->event.key.m_ts - cal_clock_.m_ts; \ + if (diff < diff##x##_) { \ + l = i; \ + goto found_l; \ + } \ + if (min_e == NULL || min_e->event.key > e->event.key) { \ + min_e = e; \ + l = i; \ + } \ + } \ + if (++i == nbuckets_) i = 0; \ +} while (0) + + // CAL_DEQUEUE applied successively will find the event to + // dequeue (within one year) and keep track of the + // minimum-priority event seen so far; the argument controls + // the criteria used to decide whether the event should be + // considered `within one year'. Importantly, the number of + // buckets should not be less than 4. + CAL_DEQUEUE(0); + CAL_DEQUEUE(1); + for (; i != lastbucket_dec; ) { + CAL_DEQUEUE(2); + } + // one last bucket is left unchecked - take the minimum + // [could have done CAL_DEQUEUE(3) with diff3_ = bwidth*(nbuck*3/2-1)] + e = buckets_[i].list_; + if (min_e != NULL && + (e == NULL || min_e->event.key < e->event.key)) + e = min_e; + else { + //assert(e); + l = i; + } + found_l: + //assert(buckets_[l].count_ >= 0); + //assert(buckets_[l].list_ == e); + + /* l is the index of the bucket to dequeue, e is the event */ + /* + * still want to advance lastbucket_ and cal_clock_ to save + * time when deque() follows. + */ + assert (l != -1); + lastbucket_ = l; + cal_clock_ = e->event.key; + + return e; +} + +void +Ns2CalendarScheduler::reinit(int nbuck, uint64_t bwidth, Scheduler::EventKey start) +{ + buckets_ = new Bucket[nbuck]; + + memset(buckets_, 0, sizeof(Bucket)*nbuck); //faster than ctor + + width_ = bwidth; + nbuckets_ = nbuck; + qsize_ = 0; + stat_qsize_ = 0; + + lastbucket_ = CALENDAR_HASH(start); + + diff0_ = bwidth*nbuck/2; + diff1_ = diff0_ + bwidth; + diff2_ = bwidth*nbuck; + //diff3_ = bwidth*(nbuck*3/2-1); + + bot_threshold_ = (nbuck >> 1) - 2; + top_threshold_ = (nbuck << 1); +} + +void +Ns2CalendarScheduler::resize(int newsize, Scheduler::EventKey start) +{ + double bwidth; + if (newsize == nbuckets_) { + /* we resize for bwidth*/ + if (head_search_) bwidth = head_search_; else bwidth = 1; + if (insert_search_) bwidth = bwidth / insert_search_; + bwidth = sqrt (bwidth) * width_; + if (bwidth < min_bin_width_) { + if (time_to_newwidth_>0) { + time_to_newwidth_ --; + head_search_ = 0; + insert_search_ = 0; + round_num_ = 0; + return; //failed to adjust bwidth + } else { + // We have many (adjust_new_width_interval_) times failure in adjusting bwidth. + // should do a reshuffle with newwidth + bwidth = newwidth(newsize); + } + } + //snoopy queue calculation + } else { + /* we resize for size */ + bwidth = newwidth(newsize); + if (newsize < 4) + newsize = 4; + } + + Bucket *oldb = buckets_; + int oldn = nbuckets_; + + reinit(newsize, bwidth, start); + + // copy events to new buckets + int i; + + for (i = 0; i < oldn; ++i) { + // we can do inserts faster, if we use insert2, but to + // preserve FIFO, we have to start from the end of + // each bucket and use insert2 + if (oldb[i].list_) { + BucketItem *tail = oldb[i].list_->prev_; + BucketItem *e = tail; + do { + BucketItem* ep = e->prev_; + e->next_ = e->prev_ = 0; + insert2(e); + e = ep; + } while (e != tail); + } + } + head_search_ = 0; + insert_search_ = 0; + round_num_ = 0; + delete [] oldb; +} + +void +Ns2CalendarScheduler::insert2(Ns2CalendarScheduler::BucketItem* e) +{ + // Same as insert, but for inserts e *before* any same-time-events, if + // there should be any. Since it is used only by CalendarScheduler::newwidth(), + // some important checks present in insert() need not be performed. + + int i = CALENDAR_HASH(e->event.key); + BucketItem *head = buckets_[i].list_; + BucketItem *before=0; + if (!head) { + buckets_[i].list_ = e; + e->next_ = e->prev_ = e; + ++stat_qsize_; + ++buckets_[i].count_; + } else { + bool newhead; + if (e->event.key > head->prev_->event.key) { //strict LIFO, so > and not >= + // insert at the tail + before = head; + newhead = false; + } else { + // insert event in time sorted order, LIFO for sim-time events + for (before = head; e->event.key > before->event.key; before = before->next_) + ; + newhead = (before == head); + } + + e->next_ = before; + e->prev_ = before->prev_; + before->prev_ = e; + e->prev_->next_ = e; + if (newhead) { + buckets_[i].list_ = e; + //assert(e->time_ <= e->next_->time_); + } + + if (e != e->next_ && e->next_->event.key != e->event.key) { + // unique timing + ++stat_qsize_; + ++buckets_[i].count_; + } + } + //assert(e == buckets_[i].list_ || e->prev_->time_ <= e->time_); + //assert(e == buckets_[i].list_->prev_ || e->next_->time_ >= e->time_); + + ++qsize_; + // no need to check resizing +} + +uint64_t +Ns2CalendarScheduler::newwidth(int newsize) +{ + if (adjust_new_width_interval_) { + time_to_newwidth_ = adjust_new_width_interval_; + if (avg_gap_ > 0) return avg_gap_*4.0; + } + int i; + int max_bucket = 0; // index of the fullest bucket + for (i = 1; i < nbuckets_; ++i) { + if (buckets_[i].count_ > buckets_[max_bucket].count_) + max_bucket = i; + } + int nsamples = buckets_[max_bucket].count_; + + if (nsamples <= 4) return width_; + + uint64_t nw = buckets_[max_bucket].list_->prev_->event.key.m_ts + - buckets_[max_bucket].list_->event.key.m_ts; + + nw /= ((newsize < nsamples) ? newsize : nsamples); // min (newsize, nsamples) + nw *= 4.0; + + nw = std::max (nw, min_bin_width_); + + return nw; +} + + } // namespace ns3 diff --git a/src/simulator/ns2-calendar-scheduler.h b/src/simulator/ns2-calendar-scheduler.h index 88fbeae6a..d9da5245f 100644 --- a/src/simulator/ns2-calendar-scheduler.h +++ b/src/simulator/ns2-calendar-scheduler.h @@ -1,23 +1,8 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* - * Copyright (c) 1994 Regents of the University of California. - * Copyright (c) 2009 INRIA - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * * Authors: - * David Wetherall : originally, in ns-2, back in 1997, + * David Wetherall : originally, in ns-2, back in 1997 + * David X. Wei: optimizations in ns-2.28 * Mathieu Lacage : port to ns-3 */ @@ -53,6 +38,44 @@ public: virtual void Remove (const Event &ev); private: + struct BucketItem { + ns3::Scheduler::Event event; + struct BucketItem *next_; + struct BucketItem *prev_; + }; + struct Bucket { + struct BucketItem *list_; + int count_; + }; + + void reinit(int nbuck, uint64_t bwidth, Scheduler::EventKey start); + void resize(int newsize, Scheduler::EventKey start); + uint64_t newwidth(int newsize); + void insert2 (Ns2CalendarScheduler::BucketItem *e); + Ns2CalendarScheduler::BucketItem *head (void); + + + uint64_t min_bin_width_; // minimum bin width for Calendar Queue + unsigned int adjust_new_width_interval_; // The interval (in unit of resize time) for adjustment of bin width. A zero value disables automatic bin width adjustment + unsigned time_to_newwidth_; // how many time we failed to adjust the width based on snoopy-queue + long unsigned head_search_; + long unsigned insert_search_; + int round_num_; + long int gap_num_; //the number of gap samples in this window (in process of calculation) + uint64_t last_time_; //the departure time of first event in this window + double avg_gap_; //the average gap in last window (finished calculation) + + uint64_t width_; + uint64_t diff0_, diff1_, diff2_; /* wrap-around checks */ + + int stat_qsize_; /* # of distinct priorities in queue*/ + int nbuckets_; + int lastbucket_; + int top_threshold_; + int bot_threshold_; + int qsize_; + struct Bucket *buckets_; + Scheduler::EventKey cal_clock_; }; } // namespace ns3 From d14c6a670d7e61627c792a8702c9ac9e812ec99f Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Fri, 16 Jan 2009 08:58:17 +0100 Subject: [PATCH 10/23] add missing copyright/license statement --- src/simulator/ns2-calendar-scheduler.cc | 17 ++++++++++++++++- src/simulator/ns2-calendar-scheduler.h | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/simulator/ns2-calendar-scheduler.cc b/src/simulator/ns2-calendar-scheduler.cc index f3f00028b..76143f315 100644 --- a/src/simulator/ns2-calendar-scheduler.cc +++ b/src/simulator/ns2-calendar-scheduler.cc @@ -1,6 +1,21 @@ /* -*- Mode:C++; c-basic-offset:8; tab-width:8; -*- */ /* - * XXXX + * Copyright (c) 1997 David Wetherall + * Copyright (c) 2005 David Wei + * Copyright (c) 2009 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "ns2-calendar-scheduler.h" diff --git a/src/simulator/ns2-calendar-scheduler.h b/src/simulator/ns2-calendar-scheduler.h index d9da5245f..e6b7e7a49 100644 --- a/src/simulator/ns2-calendar-scheduler.h +++ b/src/simulator/ns2-calendar-scheduler.h @@ -1,5 +1,22 @@ /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* + * Copyright (c) 1997 David Wetherall + * Copyright (c) 2005 David Wei + * Copyright (c) 2009 INRIA + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * * Authors: * David Wetherall : originally, in ns-2, back in 1997 * David X. Wei: optimizations in ns-2.28 From edc5b803a0261f370b9fcc19bc3743125e729c91 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Fri, 16 Jan 2009 09:06:59 +0100 Subject: [PATCH 11/23] add missing include --- src/simulator/ns2-calendar-scheduler.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/simulator/ns2-calendar-scheduler.cc b/src/simulator/ns2-calendar-scheduler.cc index 76143f315..5a2c0064c 100644 --- a/src/simulator/ns2-calendar-scheduler.cc +++ b/src/simulator/ns2-calendar-scheduler.cc @@ -24,6 +24,7 @@ #include "ns3/log.h" #include #include +#include namespace ns3 { From 0642485437a0b6c48706958964a73d762387de20 Mon Sep 17 00:00:00 2001 From: Guillaume Vu-Brugier Date: Fri, 16 Jan 2009 09:08:20 +0100 Subject: [PATCH 12/23] bug 329: pcap files generated in native win32 (mingw) are always corrupt --- src/common/pcap-writer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/pcap-writer.cc b/src/common/pcap-writer.cc index 56ec492d3..0c8175fa5 100644 --- a/src/common/pcap-writer.cc +++ b/src/common/pcap-writer.cc @@ -86,7 +86,7 @@ PcapWriter::Open (std::string const &name) NS_LOG_LOGIC ("Created writer " << m_writer); - m_writer->open (name.c_str ()); + m_writer->open (name.c_str (), std::ios_base::binary | std::ios_base::out); NS_ABORT_MSG_IF (m_writer->fail (), "PcapWriter::Open(): m_writer->open(" << name.c_str () << ") failed"); NS_ASSERT_MSG (m_writer->is_open (), "PcapWriter::Open(): m_writer not open"); From f43e499af6a7fd78b3f2e1073064977d0c881434 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Fri, 16 Jan 2009 12:33:22 +0000 Subject: [PATCH 13/23] examples/wifi-ap.cc ported to Python (minus tracing) --- examples/wifi-ap.py | 166 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 examples/wifi-ap.py diff --git a/examples/wifi-ap.py b/examples/wifi-ap.py new file mode 100644 index 000000000..75f180d48 --- /dev/null +++ b/examples/wifi-ap.py @@ -0,0 +1,166 @@ +# -*- Mode: Python; -*- +# /* +# * Copyright (c) 2005,2006,2007 INRIA +# * Copyright (c) 2009 INESC Porto +# * +# * This program is free software; you can redistribute it and/or modify +# * it under the terms of the GNU General Public License version 2 as +# * published by the Free Software Foundation; +# * +# * This program is distributed in the hope that it will be useful, +# * but WITHOUT ANY WARRANTY; without even the implied warranty of +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# * GNU General Public License for more details. +# * +# * You should have received a copy of the GNU General Public License +# * along with this program; if not, write to the Free Software +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# * +# * Authors: Mathieu Lacage +# * Gustavo Carneiro +# */ + +import sys +import ns3 + +# void +# DevTxTrace (std::string context, Ptr p, Mac48Address address) +# { +# std::cout << " TX to=" << address << " p: " << *p << std::endl; +# } +# void +# DevRxTrace (std::string context, Ptr p, Mac48Address address) +# { +# std::cout << " RX from=" << address << " p: " << *p << std::endl; +# } +# void +# PhyRxOkTrace (std::string context, Ptr packet, double snr, WifiMode mode, enum WifiPreamble preamble) +# { +# std::cout << "PHYRXOK mode=" << mode << " snr=" << snr << " " << *packet << std::endl; +# } +# void +# PhyRxErrorTrace (std::string context, Ptr packet, double snr) +# { +# std::cout << "PHYRXERROR snr=" << snr << " " << *packet << std::endl; +# } +# void +# PhyTxTrace (std::string context, Ptr packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower) +# { +# std::cout << "PHYTX mode=" << mode << " " << *packet << std::endl; +# } +# void +# PhyStateTrace (std::string context, Time start, Time duration, enum WifiPhy::State state) +# { +# std::cout << " state="; +# switch (state) { +# case WifiPhy::TX: +# std::cout << "tx "; +# break; +# case WifiPhy::SYNC: +# std::cout << "sync "; +# break; +# case WifiPhy::CCA_BUSY: +# std::cout << "cca-busy"; +# break; +# case WifiPhy::IDLE: +# std::cout << "idle "; +# break; +# } +# std::cout << " start="< Date: Fri, 16 Jan 2009 17:18:49 +0000 Subject: [PATCH 14/23] Remove the last remnants of local pybindgen handling (allinone takes care of pybindgen now) --- bindings/python/wscript | 66 ----------------------------------------- wscript | 3 -- 2 files changed, 69 deletions(-) diff --git a/bindings/python/wscript b/bindings/python/wscript index 7b3181b98..bd74e470b 100644 --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -14,11 +14,6 @@ import Logs import Build import Utils -## Adjust python path to look for our local copy of pybindgen -LOCAL_PYBINDGEN_PATH = os.path.join(os.getcwd(), "bindings", "python", "pybindgen") -#PYBINDGEN_BRANCH = 'lp:pybindgen' -PYBINDGEN_BRANCH = 'https://launchpad.net/pybindgen' - ## https://launchpad.net/pybindgen/ REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 605) REQUIRED_PYGCCXML_VERSION = (0, 9, 5) @@ -33,8 +28,6 @@ def add_to_python_path(path): def set_pybindgen_pythonpath(env): if env['WITH_PYBINDGEN']: add_to_python_path(env['WITH_PYBINDGEN']) - else: - add_to_python_path(LOCAL_PYBINDGEN_PATH) def set_options(opt): @@ -47,67 +40,11 @@ def set_options(opt): help=("Rescan Python bindings. Needs working GCCXML / pygccxml environment."), action="store_true", default=False, dest='python_scan') - opt.add_option('--pybindgen-checkout', - help=("During configure, force checkout of pybingen inside ns-3, " - "instead of using the system installed version."), - action="store_true", default=False, - dest='pybindgen_checkout') opt.add_option('--with-pybindgen', help=('Path to an existing pybindgen source tree to use.'), default=None, dest='with_pybindgen', type="string") -def fetch_pybindgen(conf): - """ - Fetches pybindgen from launchpad as bindings/python/pybindgen. - Returns True if successful, False it not. - """ - bzr = conf.find_program("bzr") - if not bzr: - Logs.warn("the program 'bzr' is needed in order to fetch pybindgen") - return False - if len(REQUIRED_PYBINDGEN_VERSION) == 4: - rev = "-rrevno:%i" % REQUIRED_PYBINDGEN_VERSION[3] - else: - rev = "-rtag:%s" % '.'.join([str(x) for x in REQUIRED_PYBINDGEN_VERSION]) - - if os.path.exists(LOCAL_PYBINDGEN_PATH): - print "Trying to update pybindgen; this will fail if no network connection is available. Hit Ctrl-C to skip." - - cmd = [bzr, "pull", rev, PYBINDGEN_BRANCH] - print " => ", ' '.join(cmd) - try: - if subprocess.Popen(cmd, cwd=LOCAL_PYBINDGEN_PATH).wait(): - return False - except KeyboardInterrupt: - print "Interrupted; Python bindings will be disabled." - return False - print "Update was successful." - else: - print "Trying to fetch pybindgen; this will fail if no network connection is available. Hit Ctrl-C to skip." - cmd = [bzr, "checkout", rev, PYBINDGEN_BRANCH, LOCAL_PYBINDGEN_PATH] - print " => ", ' '.join(cmd) - try: - if subprocess.Popen(cmd).wait(): - return False - except KeyboardInterrupt: - print "Interrupted; Python bindings will be disabled." - shutil.rmtree(LOCAL_PYBINDGEN_PATH, True) - return False - print "Fetch was successful." - - ## generate a fake version.py file in pybindgen it's safer this - ## way, since the normal version generation process requires - ## bazaar python bindings, which may not be available. - vfile = open(os.path.join(LOCAL_PYBINDGEN_PATH, "pybindgen", "version.py"), "wt") - vfile.write(""" -# (fake version generated by ns-3) -__version__ = %r -""" % list(REQUIRED_PYBINDGEN_VERSION)) - vfile.close() - - return True - def configure(conf): conf.env['ENABLE_PYTHON_BINDINGS'] = False @@ -140,9 +77,6 @@ def configure(conf): conf.env['WITH_PYBINDGEN'] = os.path.abspath(Options.options.with_pybindgen) no_net = True - if Options.options.pybindgen_checkout: - fetch_pybindgen(conf) - set_pybindgen_pythonpath(conf.env) try: diff --git a/wscript b/wscript index 9dd11b79a..cbf06337c 100644 --- a/wscript +++ b/wscript @@ -53,9 +53,6 @@ def dist_hook(): shutil.rmtree("doc/latex", True) shutil.rmtree("nsc", True) - if not os.path.exists("bindings/python/pybindgen"): - raise Utils.WafError("Missing pybindgen checkout; run './waf configure --pybindgen-checkout' first.") - ## build the name of the traces subdirectory. Will be something like ## ns-3-dev-ref-traces traces_name = APPNAME + '-' + VERSION + regression.REGRESSION_SUFFIX From 28a9688bdf5087420753c5fc77c072b3f8eb26a8 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Fri, 16 Jan 2009 18:52:00 +0000 Subject: [PATCH 15/23] Fix WifiMacQueue typeid registration --- src/devices/wifi/wifi-mac-queue.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/devices/wifi/wifi-mac-queue.cc b/src/devices/wifi/wifi-mac-queue.cc index ec300b76a..ab7d5e30b 100644 --- a/src/devices/wifi/wifi-mac-queue.cc +++ b/src/devices/wifi/wifi-mac-queue.cc @@ -28,6 +28,9 @@ using namespace std; namespace ns3 { +NS_OBJECT_ENSURE_REGISTERED (WifiMacQueue); + + WifiMacQueue::Item::Item (Ptr packet, WifiMacHeader const &hdr, Time tstamp) @@ -37,7 +40,7 @@ WifiMacQueue::Item::Item (Ptr packet, TypeId WifiMacQueue::GetTypeId (void) { - static TypeId tid = TypeId ("WifiMacQueue") + static TypeId tid = TypeId ("ns3::WifiMacQueue") .SetParent () .AddConstructor () .AddAttribute ("MaxPacketNumber", "If a packet arrives when there are already this number of packets, it is dropped.", From 8731761fcd6a6015edc1afbc59fd63490c1eaadf Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 17 Jan 2009 16:57:42 +0000 Subject: [PATCH 16/23] Remove no longer needed WAF command execution win32 workaround --- wscript | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/wscript b/wscript index cbf06337c..2ce333f5d 100644 --- a/wscript +++ b/wscript @@ -318,21 +318,6 @@ def add_scratch_programs(bld): obj.name = obj.target -## -## This replacement spawn function increases the maximum command line length to 32k -## -def _exec_command_interact_win32(s): - if Params.g_verbose: - print s - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - proc = subprocess.Popen(s, shell=False, startupinfo=startupinfo) - stat = proc.wait() - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - - def build(bld): if Options.options.no_task_lines: import Runner @@ -340,10 +325,6 @@ def build(bld): pass Runner.printout = null_printout - if sys.platform == 'win32': - import Runner - Runner.exec_command = _exec_command_interact_win32 - Options.cwd_launch = bld.path.abspath() bld.create_ns3_program = types.MethodType(create_ns3_program, bld) bld.create_suid_program = types.MethodType(create_suid_program, bld) From 796dee6f9eda56c649b2b2528c3d91ab2f8045c3 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 17 Jan 2009 16:58:42 +0000 Subject: [PATCH 17/23] On native win32, we cannot use -D_DEBUG when compiling Python extensions --- bindings/python/wscript | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bindings/python/wscript b/bindings/python/wscript index bd74e470b..69825e2b6 100644 --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -434,7 +434,15 @@ def build(bld): pymod.target = 'ns3/_ns3' pymod.name = 'ns3module' pymod.uselib_local = "ns3" - pymod.env.append_value('CXXDEFINES', ['NS_DEPRECATED=', 'NS3_DEPRECATED_H']) + + defines = list(pymod.env['CXXDEFINES']) + defines.extend(['NS_DEPRECATED=', 'NS3_DEPRECATED_H']) + if Options.platform == 'win32': + try: + defines.remove('_DEBUG') # causes undefined symbols on win32 + except ValueError: + pass + pymod.env['CXXDEFINES'] = defines # copy the __init__.py file to the build dir. waf can't handle # this, it's against waf's principles to have build dir files From 8bd42a0693d04b21f2216f65022080d5f64f9c2d Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 17 Jan 2009 16:59:45 +0000 Subject: [PATCH 18/23] Make it easy to turn on profiling of pybindgen --- bindings/python/ns3modulegen.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bindings/python/ns3modulegen.py b/bindings/python/ns3modulegen.py index 21f9e72d9..a54fb5768 100755 --- a/bindings/python/ns3modulegen.py +++ b/bindings/python/ns3modulegen.py @@ -146,5 +146,14 @@ def main(): out.close() if __name__ == '__main__': - main() + if 0: + try: + import cProfile as profile + except ImportError: + main() + else: + print >> sys.stderr, "** running under profiler" + profile.run('main()', 'ns3modulegen.pstat') + else: + main() From b4f451047b5ddf79407a1d1fa49c414e3e2b9b03 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sat, 17 Jan 2009 18:19:24 +0000 Subject: [PATCH 19/23] Update waf; closes #466. --- waf | Bin 80275 -> 81032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/waf b/waf index 886a0e7f830b19ef44c0c2ed02c0e35d89c8360b..1d61ab7a2b47428e1e7d0d91586a27a0c00a0533 100755 GIT binary patch delta 78021 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 z

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%0AI3t%iY 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 Date: Sun, 18 Jan 2009 12:14:32 +0100 Subject: [PATCH 20/23] bug 472: fix build with gcc 3.4.6 --- src/simulator/ns2-calendar-scheduler.cc | 13 ++++++------- src/simulator/ns2-calendar-scheduler.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/simulator/ns2-calendar-scheduler.cc b/src/simulator/ns2-calendar-scheduler.cc index 5a2c0064c..d2cc19e75 100644 --- a/src/simulator/ns2-calendar-scheduler.cc +++ b/src/simulator/ns2-calendar-scheduler.cc @@ -58,7 +58,7 @@ Ns2CalendarScheduler::Ns2CalendarScheduler () round_num_ = 0; time_to_newwidth_ = adjust_new_width_interval_; cal_clock_ = Scheduler::EventKey (); - reinit(4, 1.0, cal_clock_); + reinit(4, 1, cal_clock_); } Ns2CalendarScheduler::~Ns2CalendarScheduler () { @@ -358,12 +358,12 @@ Ns2CalendarScheduler::reinit(int nbuck, uint64_t bwidth, Scheduler::EventKey sta void Ns2CalendarScheduler::resize(int newsize, Scheduler::EventKey start) { - double bwidth; + uint64_t bwidth; if (newsize == nbuckets_) { /* we resize for bwidth*/ if (head_search_) bwidth = head_search_; else bwidth = 1; if (insert_search_) bwidth = bwidth / insert_search_; - bwidth = sqrt (bwidth) * width_; + bwidth = static_cast (sqrt (bwidth) * width_); if (bwidth < min_bin_width_) { if (time_to_newwidth_>0) { time_to_newwidth_ --; @@ -469,7 +469,7 @@ Ns2CalendarScheduler::newwidth(int newsize) { if (adjust_new_width_interval_) { time_to_newwidth_ = adjust_new_width_interval_; - if (avg_gap_ > 0) return avg_gap_*4.0; + if (avg_gap_ > 0) return avg_gap_*4; } int i; int max_bucket = 0; // index of the fullest bucket @@ -481,11 +481,10 @@ Ns2CalendarScheduler::newwidth(int newsize) if (nsamples <= 4) return width_; - uint64_t nw = buckets_[max_bucket].list_->prev_->event.key.m_ts - - buckets_[max_bucket].list_->event.key.m_ts; + uint64_t nw = (buckets_[max_bucket].list_->prev_->event.key.m_ts + - buckets_[max_bucket].list_->event.key.m_ts) * 4; nw /= ((newsize < nsamples) ? newsize : nsamples); // min (newsize, nsamples) - nw *= 4.0; nw = std::max (nw, min_bin_width_); diff --git a/src/simulator/ns2-calendar-scheduler.h b/src/simulator/ns2-calendar-scheduler.h index e6b7e7a49..bb06ead21 100644 --- a/src/simulator/ns2-calendar-scheduler.h +++ b/src/simulator/ns2-calendar-scheduler.h @@ -80,7 +80,7 @@ private: int round_num_; long int gap_num_; //the number of gap samples in this window (in process of calculation) uint64_t last_time_; //the departure time of first event in this window - double avg_gap_; //the average gap in last window (finished calculation) + int64_t avg_gap_; //the average gap in last window (finished calculation) uint64_t width_; uint64_t diff0_, diff1_, diff2_; /* wrap-around checks */ From 587ee24f714760f5d43c691ca29f57c8eadfc351 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sun, 18 Jan 2009 19:59:46 +0000 Subject: [PATCH 21/23] waf --run now takes either full path to a program or just the (flat) program name, for all C++ programs --- wscript | 13 +++++++------ wutils.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/wscript b/wscript index 2ce333f5d..e34a46242 100644 --- a/wscript +++ b/wscript @@ -306,15 +306,16 @@ def add_scratch_programs(bld): continue if os.path.isdir(os.path.join("scratch", filename)): obj = bld.create_ns3_program(filename, all_modules) - obj.path = obj.path.find_dir('scratch') - obj.find_sources_in_dirs(filename) - obj.target = os.path.join(filename, filename) + obj.path = obj.path.find_dir('scratch').find_dir(filename) + obj.find_sources_in_dirs('.') + obj.target = filename obj.name = obj.target elif filename.endswith(".cc"): name = filename[:-len(".cc")] obj = bld.create_ns3_program(name, all_modules) - obj.source = "scratch/%s" % filename - obj.target = "scratch/%s" % name + obj.path = obj.path.find_dir('scratch') + obj.source = filename + obj.target = name obj.name = obj.target @@ -414,7 +415,7 @@ def build(bld): # nothing more; this greatly speeds up compilation when all you # want to do is run a test program. if not Options.options.compile_targets: - Options.options.compile_targets = program_name + Options.options.compile_targets = os.path.basename(program_name) diff --git a/wutils.py b/wutils.py index 1b0413692..698900305 100644 --- a/wutils.py +++ b/wutils.py @@ -38,9 +38,30 @@ def get_command_template(*arguments): return cmd +if hasattr(os.path, "relpath"): + relpath = os.path.relpath # since Python 2.6 +else: + def relpath(path, start=os.path.curdir): + """Return a relative version of a path""" + + if not path: + raise ValueError("no path specified") + + start_list = os.path.abspath(start).split(os.path.sep) + path_list = os.path.abspath(path).split(os.path.sep) + + # Work out how much of the filepath is shared by start and path. + i = len(os.path.commonprefix([start_list, path_list])) + + rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:] + if not rel_list: + return os.path.curdir + return os.path.join(*rel_list) + def find_program(program_name, env): launch_dir = os.path.abspath(Options.cwd_launch) + top_dir = os.path.abspath(Options.launch_dir) found_programs = [] for obj in Build.bld.all_task_gen: if not getattr(obj, 'is_ns3_program', False): @@ -51,8 +72,11 @@ def find_program(program_name, env): or obj.path.abspath(env).startswith(launch_dir)): continue - found_programs.append(obj.target) - if obj.target == program_name: + name1 = obj.target + name2 = os.path.join(relpath(obj.path.abspath(), top_dir), obj.target) + names = [name1, name2] + found_programs.extend(names) + if program_name in names: return obj raise ValueError("program '%s' not found; available programs are: %r" % (program_name, found_programs)) From ae5749aea79862f22af31afe8491990d9f452b1b Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sun, 18 Jan 2009 22:18:49 +0000 Subject: [PATCH 22/23] Cleanup: remove regression reference traces downloading code (moved to allinone) --- regression.py | 61 +-------------------------------------------------- wscript | 3 ++- 2 files changed, 3 insertions(+), 61 deletions(-) diff --git a/regression.py b/regression.py index 36d69b3f0..c2a7809af 100644 --- a/regression.py +++ b/regression.py @@ -14,32 +14,6 @@ import Utils import wutils -# -# The directory in which the tarball of the reference traces lives. This is -# used if Mercurial is not on the system. -# -REGRESSION_TRACES_URL = "http://www.nsnam.org/releases/" - -# -# The path to the Mercurial repository used to find the reference traces if -# we find "hg" on the system. We expect that the repository will be named -# identically to refDirName below -# -REGRESSION_TRACES_REPO = "http://code.nsnam.org/" - -# -# Name of the local directory where the regression code lives. -# -REGRESSION_DIR = "regression" - -# -# The last part of the path name to use to find the regression traces. The -# path will be APPNAME + '-' + VERSION + REGRESSION_SUFFIX, e.g., -# ns-3-dev-ref-traces -# -REGRESSION_SUFFIX = "-ref-traces" - - def dev_null(): if sys.platform == 'win32': return open("NUL:", "w") @@ -179,7 +153,7 @@ def _find_tests(testdir): def run_regression(reference_traces): """Execute regression tests. Called with cwd set to the 'regression' subdir of ns-3. - @param reference_traces: reference traces directory, or None for default. + @param reference_traces: reference traces directory. """ @@ -188,13 +162,6 @@ def run_regression(reference_traces): print "Tests directory does not exist" sys.exit(3) - dir_name = (wutils.APPNAME + '-' + wutils.VERSION + REGRESSION_SUFFIX) - if reference_traces is None: - reference_traces = dir_name - no_net = False - else: - no_net = True - sys.path.append(testdir) sys.modules['tracediff'] = Regression(testdir, reference_traces) @@ -205,32 +172,6 @@ def run_regression(reference_traces): print "========== Running Regression Tests ==========" env = Build.bld.env - if not no_net: - if env['MERCURIAL']: - print "Synchronizing reference traces using Mercurial." - if not os.path.exists(reference_traces): - print "Cloning " + REGRESSION_TRACES_REPO + dir_name + " from repo." - argv = ["hg", "clone", REGRESSION_TRACES_REPO + dir_name, reference_traces] - rv = subprocess.Popen(argv).wait() - else: - _dir = os.getcwd() - os.chdir(reference_traces) - try: - print "Pulling " + REGRESSION_TRACES_REPO + dir_name + " from repo." - result = subprocess.Popen(["hg", "-q", "pull", REGRESSION_TRACES_REPO + dir_name]).wait() - if not result: - result = subprocess.Popen(["hg", "-q", "update"]).wait() - finally: - os.chdir("..") - if result: - raise Utils.WafError("Synchronizing reference traces using Mercurial failed.") - else: - if not os.path.exists(reference_traces): - traceball = dir_name + wutils.TRACEBALL_SUFFIX - print "Retrieving " + traceball + " from web." - urllib.urlretrieve(REGRESSION_TRACES_URL + traceball, traceball) - os.system("tar -xjf %s -C .." % (traceball)) - print "Done." if not os.path.exists(reference_traces): print "Reference traces directory (%s) does not exist" % reference_traces diff --git a/wscript b/wscript index e34a46242..918cd769c 100644 --- a/wscript +++ b/wscript @@ -445,7 +445,8 @@ def shutdown(): os.chdir("regression") regression_traces = env['REGRESSION_TRACES'] if not regression_traces: - regression_traces = None + raise Utils.WafError("Cannot run regression tests: reference traces directory not given" + " (--with-regression-traces configure option)") try: retval = regression.run_regression(regression_traces) finally: From 8e70ea9b96ada204a460404267b9c113bc287078 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Sun, 18 Jan 2009 22:47:25 +0000 Subject: [PATCH 23/23] Don't abuse os.chdir so much (not thread safe) --- regression.py | 40 +++++++++++++--------------------------- wscript | 11 ++--------- wutils.py | 41 +++++++++++++++-------------------------- 3 files changed, 30 insertions(+), 62 deletions(-) diff --git a/regression.py b/regression.py index c2a7809af..037c8d96e 100644 --- a/regression.py +++ b/regression.py @@ -64,19 +64,13 @@ class Regression(object): os.mkdir(refTestDirName) if pyscript is None: - Options.options.cwd_launch = refTestDirName tmpl = "%s" for arg in arguments: tmpl = tmpl + " " + arg - wutils.run_program(testName, tmpl) + wutils.run_program(testName, tmpl, cwd=refTestDirName) else: argv = [self.env['PYTHON'], os.path.join(Options.cwd_launch, *os.path.split(pyscript))] + arguments - before = os.getcwd() - os.chdir(refTestDirName) - try: - wutils.run_argv(argv) - finally: - os.chdir(before) + wutils.run_argv(argv, cwd=refTestDirName) print "Remember to commit " + refTestDirName return 0 else: @@ -84,12 +78,11 @@ class Regression(object): print "Cannot locate reference traces in " + refTestDirName return 1 - if refTestName is None: traceDirName = testName + ".ref" else: traceDirName = refTestName - traceDirName = os.path.join ('traces', traceDirName) + traceDirName = os.path.join('regression', 'traces', traceDirName) try: shutil.rmtree(traceDirName) @@ -97,20 +90,13 @@ class Regression(object): pass os.mkdir(traceDirName) - #os.system("./waf --cwd regression/traces --run " + - # testName + " > /dev/null 2>&1") - if pyscript is None: - Options.options.cwd_launch = traceDirName - wutils.run_program(testName, command_template=wutils.get_command_template(*arguments)) + wutils.run_program(testName, + command_template=wutils.get_command_template(*arguments), + cwd=traceDirName) else: argv = [self.env['PYTHON'], os.path.join('..', '..', '..', *os.path.split(pyscript))] + arguments - before = os.getcwd() - os.chdir(traceDirName) - try: - wutils.run_argv(argv) - finally: - os.chdir(before) + wutils.run_argv(argv, cwd=traceDirName) if verbose: #diffCmd = "diff traces " + refTestDirName + " | head" @@ -157,7 +143,7 @@ def run_regression(reference_traces): """ - testdir = "tests" + testdir = os.path.join("regression", "tests") if not os.path.exists(testdir): print "Tests directory does not exist" sys.exit(3) @@ -193,7 +179,7 @@ def run_regression(reference_traces): except NotImplementedError: print "SKIP " + test - return len(bad) > 0 + return (len(bad) > 0) def _run_regression_test(test): @@ -202,15 +188,15 @@ def _run_regression_test(test): Arguments: test -- the name of the test """ - - if os.path.exists("traces"): - files = os.listdir("traces") + traces_dir = os.path.join("regression", "traces") + if os.path.exists(traces_dir): + files = os.listdir(traces_dir) for file in files: if file == '.' or file == '..': continue shutil.rmtree(os.path.join("traces", file), ignore_errors=True) else: - os.mkdir("traces") + os.mkdir(traces_dir) mod = __import__(test, globals(), locals(), []) return mod.run(verbose=(Options.options.verbose > 0), diff --git a/wscript b/wscript index 918cd769c..6197d4304 100644 --- a/wscript +++ b/wscript @@ -194,9 +194,7 @@ def configure(conf): variant_name = Options.options.build_profile if Options.options.regression_traces is not None: - variant_env['REGRESSION_TRACES'] = os.path.join("..", Options.options.regression_traces) - else: - variant_env['REGRESSION_TRACES'] = None + variant_env['REGRESSION_TRACES'] = os.path.abspath(Options.options.regression_traces) if Options.options.enable_gcov: variant_name += '-gcov' @@ -441,16 +439,11 @@ def shutdown(): if not env['DIFF']: raise Utils.WafError("Cannot run regression tests: the 'diff' program is not installed.") - _dir = os.getcwd() - os.chdir("regression") regression_traces = env['REGRESSION_TRACES'] if not regression_traces: raise Utils.WafError("Cannot run regression tests: reference traces directory not given" " (--with-regression-traces configure option)") - try: - retval = regression.run_regression(regression_traces) - finally: - os.chdir(_dir) + retval = regression.run_regression(regression_traces) if retval: sys.exit(retval) diff --git a/wutils.py b/wutils.py index 698900305..9cebb2a5d 100644 --- a/wutils.py +++ b/wutils.py @@ -117,10 +117,10 @@ def get_proc_env(os_env=None): return proc_env -def run_argv(argv, os_env=None): +def run_argv(argv, os_env=None, cwd=None): proc_env = get_proc_env(os_env) #env = Build.bld.env - retval = subprocess.Popen(argv, env=proc_env).wait() + retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() if retval: raise Utils.WafError("Command %s exited with code %i" % (argv, retval)) return retval @@ -167,7 +167,7 @@ def get_run_program(program_string, command_template=None): execvec = shlex.split(command_template % (program_node.abspath(env),)) return program_name, execvec -def run_program(program_string, command_template=None): +def run_program(program_string, command_template=None, cwd=None): """ if command_template is not None, then program_string == program name and argv is given by command_template with %s replaced by the @@ -175,34 +175,23 @@ def run_program(program_string, command_template=None): a shell command with first name being the program name. """ dummy_program_name, execvec = get_run_program(program_string, command_template) - former_cwd = os.getcwd() - if (Options.options.cwd_launch): - os.chdir(Options.options.cwd_launch) - else: - os.chdir(Options.cwd_launch) - try: - retval = run_argv(execvec) - finally: - os.chdir(former_cwd) - - return retval + if cwd is None: + if (Options.options.cwd_launch): + cwd = Options.options.cwd_launch + else: + cwd = Options.cwd_launch + return run_argv(execvec, cwd=cwd) def run_python_program(program_string): env = Build.bld.env execvec = shlex.split(program_string) - - former_cwd = os.getcwd() - if (Options.options.cwd_launch): - os.chdir(Options.options.cwd_launch) - else: - os.chdir(Options.cwd_launch) - try: - retval = run_argv([env['PYTHON']] + execvec) - finally: - os.chdir(former_cwd) - - return retval + if cwd is None: + if (Options.options.cwd_launch): + cwd = Options.options.cwd_launch + else: + cwd = Options.cwd_launch + return run_argv([env['PYTHON']] + execvec, cwd=cwd)