src/core/model/calendar-scheduler.cc
author Maja Grubišić <maja.grubisic@live.com>
Sat, 10 Nov 2012 19:16:38 +0100
changeset 9134 7a750f032acd
parent 7812 61fc92f6d7f4
child 9138 967a214aeb54
permissions -rw-r--r--
Clean up function logging of core module.
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>
7383
c5e131450339 remove ns3/ prefix which is un-needed now that all files are in same module.
Mathieu Lacage <mathieu.lacage@gmail.com>
parents: 7169
diff changeset
    26
#include "assert.h"
c5e131450339 remove ns3/ prefix which is un-needed now that all files are in same module.
Mathieu Lacage <mathieu.lacage@gmail.com>
parents: 7169
diff changeset
    27
#include "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
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
    35
TypeId
4054
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
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
    38
  NS_LOG_FUNCTION_NOARGS ();
4054
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    39
  static TypeId tid = TypeId ("ns3::CalendarScheduler")
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    40
    .SetParent<Scheduler> ()
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    41
    .AddConstructor<CalendarScheduler> ()
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
    42
  ;
4054
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    43
  return tid;
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    44
}
d1df606b20f8 add SchedulerType global variable
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4052
diff changeset
    45
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    46
CalendarScheduler::CalendarScheduler ()
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    47
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    48
  NS_LOG_FUNCTION (this);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    49
  Init (2, 1, 0);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    50
  m_qSize = 0;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    51
}
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    52
CalendarScheduler::~CalendarScheduler ()
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    53
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    54
  NS_LOG_FUNCTION (this);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    55
  delete [] m_buckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    56
  m_buckets = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    57
}
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    58
void
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
    59
CalendarScheduler::Init (uint32_t nBuckets,
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    60
                         uint64_t width,
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    61
                         uint64_t startPrio)
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    62
{
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    63
  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
    64
  m_buckets = new Bucket [nBuckets];
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    65
  m_nBuckets = nBuckets;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    66
  m_width = width;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    67
  m_lastPrio = startPrio;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    68
  m_lastBucket = Hash (startPrio);
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    69
  m_bucketTop = (startPrio / width + 1) * width;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
    70
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    71
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    72
CalendarScheduler::PrintInfo (void)
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    73
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
    74
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
    75
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
    76
  std::cout << "nBuckets=" << m_nBuckets << ", width=" << m_width << std::endl;
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    77
  std::cout << "Bucket Distribution ";
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    78
  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
    79
    {
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    80
      std::cout << m_buckets[i].size () << " ";
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    81
    }
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    82
  std::cout << std::endl;
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    83
}
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    84
uint32_t
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    85
CalendarScheduler::Hash (uint64_t ts) const
4050
ee134e4f44c5 optimize resizing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4049
diff changeset
    86
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
    87
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
    88
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    89
  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
    90
  return bucket;
4050
ee134e4f44c5 optimize resizing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4049
diff changeset
    91
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    92
963
3a7a66d1942c add support to cancel Now and Destroy events.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 692
diff changeset
    93
void
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    94
CalendarScheduler::DoInsert (const Event &ev)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
{
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    96
  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
    97
  // calculate bucket index.
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
    98
  uint32_t bucket = Hash (ev.key.m_ts);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
    99
  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
   100
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   101
  // insert in bucket list.
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   102
  Bucket::iterator end = m_buckets[bucket].end ();
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   103
  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
   104
    {
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   105
      if (ev.key < i->key)
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   106
        {
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   107
          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
   108
          return;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   109
        }
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 132
diff changeset
   110
    }
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   111
  m_buckets[bucket].push_back (ev);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
}
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   113
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   114
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   115
CalendarScheduler::Insert (const Event &ev)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   116
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   117
  NS_LOG_FUNCTION (this << &ev);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   118
  DoInsert (ev);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   119
  m_qSize++;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   120
  ResizeUp ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   121
}
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   122
bool
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   123
CalendarScheduler::IsEmpty (void) const
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   124
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   125
  NS_LOG_FUNCTION (this);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   126
  return m_qSize == 0;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   127
}
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   128
Scheduler::Event
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   129
CalendarScheduler::PeekNext (void) const
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   131
  NS_LOG_FUNCTION (this);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   132
  NS_ASSERT (!IsEmpty ());
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   133
  uint32_t i = m_lastBucket;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   134
  uint64_t bucketTop = m_bucketTop;
7757
c8568ed95192 Additional static casts needed for gcc-4.7 compilation
Vedran Miletić <rivanvx@gmail.com>
parents: 7383
diff changeset
   135
  Scheduler::Event minEvent = { static_cast<uint64_t>(0), { static_cast<uint32_t>(~0), static_cast<uint32_t>(~0)}};
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   136
  do
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   137
    {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   138
      if (!m_buckets[i].empty ())
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   139
        {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   140
          Scheduler::Event next = m_buckets[i].front ();
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   141
          if (next.key.m_ts < bucketTop)
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   142
            {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   143
              return next;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   144
            }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   145
          if (next.key < minEvent.key)
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   146
            {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   147
              minEvent = next;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   148
            }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   149
        }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   150
      i++;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   151
      i %= m_nBuckets;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   152
      bucketTop += m_width;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   153
    }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   154
  while (i != m_lastBucket);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   155
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   156
  return minEvent;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   159
Scheduler::Event
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   160
CalendarScheduler::DoRemoveNext (void)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   162
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   163
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   164
  uint32_t i = m_lastBucket;
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   165
  uint64_t bucketTop = m_bucketTop;
7812
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   166
  int32_t minBucket = -1;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   167
  Scheduler::EventKey minKey;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   168
  NS_ASSERT(!IsEmpty());
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   169
  minKey.m_ts = uint64_t(-int64_t(1));
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   170
  minKey.m_uid = 0;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   171
  minKey.m_context = 0xffffffff;
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   172
  do
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   173
    {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   174
      if (!m_buckets[i].empty ())
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   175
        {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   176
          Scheduler::Event next = m_buckets[i].front ();
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   177
          if (next.key.m_ts < bucketTop)
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   178
            {
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   179
              m_lastBucket = i;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   180
              m_lastPrio = next.key.m_ts;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   181
              m_bucketTop = bucketTop;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   182
              m_buckets[i].pop_front ();
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   183
              return next;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   184
            }
7812
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   185
          if (next.key < minKey)
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   186
            {
7812
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   187
              minKey = next.key;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   188
              minBucket = i;
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   189
            }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   190
        }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   191
      i++;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   192
      i %= m_nBuckets;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   193
      bucketTop += m_width;
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   194
    }
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   195
  while (i != m_lastBucket);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   196
7812
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   197
  m_lastPrio = minKey.m_ts;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   198
  m_lastBucket = Hash (minKey.m_ts);
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   199
  m_bucketTop = (minKey.m_ts / m_width + 1) * m_width;
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   200
  Scheduler::Event next = m_buckets[minBucket].front();
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   201
  m_buckets[minBucket].pop_front ();
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   202
7812
61fc92f6d7f4 bug 1387: CRASH in threaded-simulator
Mathieu Lacage <mathieu.lacage@cutebugs.net>
parents: 7757
diff changeset
   203
  return next;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   206
Scheduler::Event
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   207
CalendarScheduler::RemoveNext (void)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   208
{
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   209
  NS_LOG_FUNCTION (this << m_lastBucket << m_bucketTop);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   210
  NS_ASSERT (!IsEmpty ());
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   211
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   212
  Scheduler::Event ev = DoRemoveNext ();
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   213
  NS_LOG_LOGIC ("remove ts=" << ev.key.m_ts <<
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   214
                ", key=" << ev.key.m_uid <<
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   215
                ", from bucket=" << m_lastBucket);
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 ();
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   218
  return ev;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   219
}
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   220
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   221
void
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   222
CalendarScheduler::Remove (const Event &ev)
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   224
  NS_LOG_FUNCTION (this << &ev);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   225
  NS_ASSERT (!IsEmpty ());
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   226
  // bucket index of event
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   227
  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
   228
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   229
  Bucket::iterator end = m_buckets[bucket].end ();
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   230
  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
   231
    {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   232
      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
   233
        {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   234
          NS_ASSERT (ev.impl == i->impl);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   235
          m_buckets[bucket].erase (i);
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   236
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   237
          m_qSize--;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   238
          ResizeDown ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
   239
          return;
182
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   240
        }
0e292b31f532 do not use internal iterator void * pointer in SchedulerList
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 150
diff changeset
   241
    }
286
57e6a2006962 convert use of <cassert> to "ns3/assert.h"
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 194
diff changeset
   242
  NS_ASSERT (false);
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
}
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   245
void
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   246
CalendarScheduler::ResizeUp (void)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   247
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   248
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   249
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   250
  if (m_qSize > m_nBuckets * 2
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   251
      && m_nBuckets < 32768)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   252
    {
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   253
      Resize (m_nBuckets * 2);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   254
    }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   255
}
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   256
void
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   257
CalendarScheduler::ResizeDown (void)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   258
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   259
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   260
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   261
  if (m_qSize < m_nBuckets / 2)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   262
    {
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   263
      Resize (m_nBuckets / 2);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   264
    }
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   265
}
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   266
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   267
uint32_t
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   268
CalendarScheduler::CalculateNewWidth (void)
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   269
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   270
  NS_LOG_FUNCTION (this);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   271
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   272
  if (m_qSize < 2)
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   273
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   274
      return 1;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   275
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   276
  uint32_t nSamples;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   277
  if (m_qSize <= 5)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   278
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   279
      nSamples = m_qSize;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   280
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   281
  else
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   282
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   283
      nSamples = 5 + m_qSize / 10;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   284
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   285
  if (nSamples > 25)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   286
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   287
      nSamples = 25;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   288
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   289
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   290
  // we gather the first nSamples from the queue
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   291
  std::list<Scheduler::Event> samples;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   292
  // save state
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   293
  uint32_t lastBucket = m_lastBucket;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   294
  uint64_t bucketTop = m_bucketTop;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   295
  uint64_t lastPrio = m_lastPrio;
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   296
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   297
  // gather requested events
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   298
  for (uint32_t i = 0; i < nSamples; i++)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   299
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   300
      samples.push_back (DoRemoveNext ());
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   301
    }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   302
  // put them back
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   303
  for (std::list<Scheduler::Event>::const_iterator i = samples.begin ();
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   304
       i != samples.end (); ++i)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   305
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   306
      DoInsert (*i);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   307
    }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   308
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   309
  // restore state.
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   310
  m_lastBucket = lastBucket;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   311
  m_bucketTop = bucketTop;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   312
  m_lastPrio = lastPrio;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   313
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   314
  // finally calculate inter-time average over samples.
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   315
  uint64_t totalSeparation = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   316
  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
   317
  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
   318
  std::list<Scheduler::Event>::const_iterator next = cur;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   319
  next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   320
  while (next != end)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   321
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   322
      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
   323
      cur++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   324
      next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   325
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   326
  uint64_t twiceAvg = totalSeparation / (nSamples - 1) * 2;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   327
  totalSeparation = 0;
4051
3df44c5a1ec1 introduce lastPrio to handle resizing correctly
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4050
diff changeset
   328
  cur = samples.begin ();
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   329
  next = cur;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   330
  next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   331
  while (next != end)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   332
    {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   333
      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
   334
      if (diff <= twiceAvg)
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   335
        {
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   336
          totalSeparation += diff;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   337
        }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   338
      cur++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   339
      next++;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   340
    }
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   341
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   342
  totalSeparation *= 3;
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   343
  totalSeparation = std::max (totalSeparation, (uint64_t)1);
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   344
  return totalSeparation;
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   345
}
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   346
void
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   347
CalendarScheduler::DoResize (uint32_t newSize, uint32_t newWidth)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   348
{
9134
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   349
  NS_LOG_FUNCTION (this << newSize << newWidth);
7a750f032acd Clean up function logging of core module.
Maja Grubišić <maja.grubisic@live.com>
parents: 7812
diff changeset
   350
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   351
  Bucket *oldBuckets = m_buckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   352
  uint32_t oldNBuckets = m_nBuckets;
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   353
  Init (newSize, newWidth, m_lastPrio);
4048
6b55bbcf6f6b resize calendar queue. Slow :/
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4047
diff changeset
   354
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   355
  for (uint32_t i = 0; i < oldNBuckets; i++)
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   356
    {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   357
      Bucket::iterator end = oldBuckets[i].end ();
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   358
      for (Bucket::iterator j = oldBuckets[i].begin (); j != end; ++j)
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   359
        {
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   360
          DoInsert (*j);
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   361
        }
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   362
    }
4093
6bd9d7331edd memleak
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4054
diff changeset
   363
  delete [] oldBuckets;
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   364
}
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   365
void
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   366
CalendarScheduler::Resize (uint32_t newSize)
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   367
{
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   368
  NS_LOG_FUNCTION (this << newSize);
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   369
6180
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   370
  // PrintInfo ();
cd0d8ba00e6c coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4093
diff changeset
   371
  uint32_t newWidth = CalculateNewWidth ();
4052
62bed1686d48 simplify the implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4051
diff changeset
   372
  DoResize (newSize, newWidth);
4047
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   373
}
83d920cdfd3f a Calendar queue without resizing.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   374
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   375
} // namespace ns3