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