src/simulator/calendar-scheduler.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 04 Jul 2009 08:15:48 +0200
changeset 4654 2eaebe77d66b
parent 4093 6bd9d7331edd
permissions -rw-r--r--
Added tag ns-3.5 for changeset c975274c9707
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
4054
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
     3
 * Copyright (c) 2009 INRIA
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    21
#include "calendar-scheduler.h"
25
9b3bb088c560 first cut at george's ideas on api
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 16
diff changeset
    22
#include "event-impl.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <utility>
631
3620e5386e0d Fixed a gcc3.4.6 error for optimized builds
Raj Bhattacharjea <raj.b@gatech.edu>
parents: 439
diff changeset
    24
#include <string>
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    25
#include <list>
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 194
diff changeset
    26
#include "ns3/assert.h"
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    27
#include "ns3/log.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    29
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    31
NS_LOG_COMPONENT_DEFINE ("CalendarScheduler");
439
fed13fb45eef Incorporated defaults and command-line arguments
Raj Bhattacharjea <raj.b@gatech.edu>
parents: 286
diff changeset
    32
4054
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    33
NS_OBJECT_ENSURE_REGISTERED (CalendarScheduler);
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    34
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    35
TypeId 
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    36
CalendarScheduler::GetTypeId (void)
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    37
{
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    38
  static TypeId tid = TypeId ("ns3::CalendarScheduler")
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    39
    .SetParent<Scheduler> ()
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    40
    .AddConstructor<CalendarScheduler> ()
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    41
    ;
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    42
  return tid;
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    43
}
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    44
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    45
CalendarScheduler::CalendarScheduler ()
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    46
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    47
  NS_LOG_FUNCTION (this);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    48
  Init (2, 1, 0);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    49
  m_qSize = 0;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    50
}
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    51
CalendarScheduler::~CalendarScheduler ()
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    52
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    53
  NS_LOG_FUNCTION (this);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    54
  delete [] m_buckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    55
  m_buckets = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    56
}
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    57
void
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    58
CalendarScheduler::Init (uint32_t nBuckets, 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    59
                         uint64_t width,
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    60
                         uint64_t startPrio)
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    61
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    62
  NS_LOG_FUNCTION (this << nBuckets << width << startPrio);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    63
  m_buckets = new Bucket [nBuckets];
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    64
  m_nBuckets = nBuckets;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    65
  m_width = width;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    66
  m_lastPrio = startPrio;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    67
  m_lastBucket = Hash (startPrio);
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    68
  m_bucketTop = (startPrio / width + 1) * width;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    69
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    70
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    71
CalendarScheduler::PrintInfo (void)
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    72
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    73
  std::cout << "nBuckets=" << m_nBuckets << ", width=" << m_width<< std::endl;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    74
  std::cout << "Bucket Distribution ";
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    75
  for (uint32_t i = 0; i < m_nBuckets; i++)
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    76
    {
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    77
      std::cout << m_buckets[i].size () << " ";
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    78
    }
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    79
  std::cout << std::endl;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    80
}
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    81
uint32_t
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    82
CalendarScheduler::Hash (uint64_t ts) const
4050
ee134e4f44c5 optimize resizing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4049
diff changeset
    83
{
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    84
  uint32_t bucket = (ts / m_width) % m_nBuckets;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    85
  return bucket;
4050
ee134e4f44c5 optimize resizing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4049
diff changeset
    86
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    87
963
3a7a66d1942c add support to cancel Now and Destroy events.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 692
diff changeset
    88
void
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    89
CalendarScheduler::DoInsert (const Event &ev)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
{
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    91
  NS_LOG_FUNCTION (this << ev.key.m_ts << ev.key.m_uid);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    92
  // calculate bucket index.
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    93
  uint32_t bucket = Hash (ev.key.m_ts);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    94
  NS_LOG_LOGIC ("insert in bucket=" << bucket);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    95
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    96
  // insert in bucket list.
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    97
  Bucket::iterator end = m_buckets[bucket].end ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    98
  for (Bucket::iterator i = m_buckets[bucket].begin (); i != end; ++i) 
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
    99
    {
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   100
      if (ev.key < i->key)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   101
        {
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   102
          m_buckets[bucket].insert (i, ev);
963
3a7a66d1942c add support to cancel Now and Destroy events.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 692
diff changeset
   103
          return;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   104
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   105
    }
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   106
  m_buckets[bucket].push_back (ev);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
}
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   108
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   109
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   110
CalendarScheduler::Insert (const Event &ev)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   111
{
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   112
  DoInsert (ev);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   113
  m_qSize++;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   114
  ResizeUp ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   115
}
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   116
bool 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   117
CalendarScheduler::IsEmpty (void) const
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   118
{
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   119
  return m_qSize == 0;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   120
}
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   121
Scheduler::Event
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   122
CalendarScheduler::PeekNext (void) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
{
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   124
  NS_LOG_FUNCTION (this << m_lastBucket << m_bucketTop);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   125
  NS_ASSERT (!IsEmpty ());
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   126
  uint32_t i = m_lastBucket;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   127
  uint64_t bucketTop = m_bucketTop;
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   128
  Scheduler::Event minEvent = {0, {~0, ~0}};
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   129
  do {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   130
    if (!m_buckets[i].empty ())
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   131
      {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   132
        Scheduler::Event next = m_buckets[i].front ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   133
        if (next.key.m_ts < bucketTop)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   134
          {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   135
            return next;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   136
          }
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   137
        if (next.key < minEvent.key)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   138
          {
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   139
            minEvent = next;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   140
          }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   141
      }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   142
    i++;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   143
    i %= m_nBuckets;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   144
    bucketTop += m_width;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   145
  } while (i != m_lastBucket);
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   146
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   147
  return minEvent;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   150
Scheduler::Event
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   151
CalendarScheduler::DoRemoveNext (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
{
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   153
  uint32_t i = m_lastBucket;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   154
  uint64_t bucketTop = m_bucketTop;
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   155
  Scheduler::Event minEvent = {0, {~0, ~0}};
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   156
  do {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   157
    if (!m_buckets[i].empty ())
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   158
      {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   159
        Scheduler::Event next = m_buckets[i].front ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   160
        if (next.key.m_ts < bucketTop)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   161
          {
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   162
            m_lastBucket = i;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   163
            m_lastPrio = next.key.m_ts;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   164
            m_bucketTop = bucketTop;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   165
            m_buckets[i].pop_front ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   166
            return next;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   167
          }
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   168
        if (next.key < minEvent.key)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   169
          {
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   170
            minEvent = next;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   171
          }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   172
      }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   173
    i++;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   174
    i %= m_nBuckets;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   175
    bucketTop += m_width;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   176
  } while (i != m_lastBucket);
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   177
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   178
  m_lastPrio = minEvent.key.m_ts;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   179
  m_lastBucket = Hash (minEvent.key.m_ts);
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   180
  m_bucketTop = (minEvent.key.m_ts / m_width + 1) * m_width;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   181
  m_buckets[m_lastBucket].pop_front ();
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   182
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   183
  return minEvent;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   186
Scheduler::Event
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   187
CalendarScheduler::RemoveNext (void)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   188
{
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   189
  NS_LOG_FUNCTION (this << m_lastBucket << m_bucketTop);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   190
  NS_ASSERT (!IsEmpty ());
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   191
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   192
  Scheduler::Event ev = DoRemoveNext ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   193
  NS_LOG_LOGIC ("remove ts=" << ev.key.m_ts << 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   194
                ", key=" << ev.key.m_uid << 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   195
                ", from bucket=" << m_lastBucket);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   196
  m_qSize--;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   197
  ResizeDown ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   198
  return ev;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   199
}
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   200
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   201
void
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   202
CalendarScheduler::Remove (const Event &ev)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   204
  NS_ASSERT (!IsEmpty ());
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   205
  // bucket index of event
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   206
  uint32_t bucket = Hash (ev.key.m_ts);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   207
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   208
  Bucket::iterator end = m_buckets[bucket].end ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   209
  for (Bucket::iterator i = m_buckets[bucket].begin (); i != end; ++i)
182
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   210
    {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   211
      if (i->key.m_uid == ev.key.m_uid)
182
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   212
        {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   213
          NS_ASSERT (ev.impl == i->impl);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   214
          m_buckets[bucket].erase (i);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   215
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   216
          m_qSize--;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   217
          ResizeDown ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   218
          return;
182
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   219
        }
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   220
    }
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 194
diff changeset
   221
  NS_ASSERT (false);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   224
void 
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   225
CalendarScheduler::ResizeUp (void)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   226
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   227
  if (m_qSize > m_nBuckets * 2 && 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   228
      m_nBuckets < 32768)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   229
    {
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   230
      Resize (m_nBuckets * 2);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   231
    }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   232
}
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   233
void 
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   234
CalendarScheduler::ResizeDown (void)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   235
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   236
  if (m_qSize < m_nBuckets / 2)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   237
    {
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   238
      Resize (m_nBuckets / 2);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   239
    }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   240
}
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   241
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   242
uint32_t
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   243
CalendarScheduler::CalculateNewWidth (void)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   244
{
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   245
  if (m_qSize < 2) 
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   246
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   247
      return 1;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   248
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   249
  uint32_t nSamples;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   250
  if (m_qSize <= 5)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   251
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   252
      nSamples = m_qSize;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   253
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   254
  else
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   255
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   256
      nSamples = 5 + m_qSize / 10;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   257
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   258
  if (nSamples > 25)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   259
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   260
      nSamples = 25;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   261
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   262
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   263
  // we gather the first nSamples from the queue
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   264
  std::list<Scheduler::Event> samples;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   265
  // save state
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   266
  uint32_t lastBucket = m_lastBucket;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   267
  uint64_t bucketTop = m_bucketTop;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   268
  uint64_t lastPrio = m_lastPrio;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   269
 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   270
  // gather requested events
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   271
  for (uint32_t i = 0; i < nSamples; i++)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   272
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   273
      samples.push_back (DoRemoveNext ());
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   274
    }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   275
  // put them back
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   276
  for (std::list<Scheduler::Event>::const_iterator i = samples.begin (); 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   277
       i != samples.end (); ++i)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   278
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   279
      DoInsert (*i);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   280
    }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   281
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   282
  // restore state.
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   283
  m_lastBucket = lastBucket;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   284
  m_bucketTop = bucketTop;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   285
  m_lastPrio = lastPrio;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   286
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   287
  // finally calculate inter-time average over samples.
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   288
  uint64_t totalSeparation = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   289
  std::list<Scheduler::Event>::const_iterator end = samples.end ();
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   290
  std::list<Scheduler::Event>::const_iterator cur = samples.begin ();
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   291
  std::list<Scheduler::Event>::const_iterator next = cur;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   292
  next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   293
  while (next != end)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   294
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   295
      totalSeparation += next->key.m_ts - cur->key.m_ts;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   296
      cur++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   297
      next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   298
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   299
  uint64_t twiceAvg = totalSeparation / (nSamples - 1) * 2;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   300
  totalSeparation = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   301
  cur = samples.begin ();
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   302
  next = cur;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   303
  next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   304
  while (next != end)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   305
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   306
      uint64_t diff = next->key.m_ts - cur->key.m_ts;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   307
      if (diff <= twiceAvg)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   308
        {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   309
          totalSeparation += diff;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   310
        }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   311
      cur++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   312
      next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   313
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   314
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   315
  totalSeparation *= 3;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   316
  totalSeparation = std::max (totalSeparation, (uint64_t)1);
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   317
  return totalSeparation;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   318
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   319
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   320
CalendarScheduler::DoResize (uint32_t newSize, uint32_t newWidth)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   321
{
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   322
  Bucket *oldBuckets = m_buckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   323
  uint32_t oldNBuckets = m_nBuckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   324
  Init (newSize, newWidth, m_lastPrio);
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   325
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   326
  for (uint32_t i = 0; i < oldNBuckets; i++)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   327
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   328
      Bucket::iterator end = oldBuckets[i].end ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   329
      for (Bucket::iterator j = oldBuckets[i].begin (); j != end; ++j) 
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   330
        {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   331
          DoInsert (*j);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   332
        }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   333
    }
4093
6bd9d7331edd memleak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4054
diff changeset
   334
  delete [] oldBuckets;
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   335
}
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   336
void 
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   337
CalendarScheduler::Resize (uint32_t newSize)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   338
{
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   339
  NS_LOG_FUNCTION (this << newSize);
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   340
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   341
  //PrintInfo ();
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   342
  uint32_t newWidth = CalculateNewWidth ();  
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   343
  DoResize (newSize, newWidth);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   344
}
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   345
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   346
} // namespace ns3