src/simulator/scheduler.h
author Craig Dowell <craigdo@ee.washington.edu>
Tue, 09 Dec 2008 20:29:04 -0800
changeset 3997 a66553c56a8f
parent 3807 268b86ce5435
child 4094 7d5024b3f882
permissions -rw-r--r--
make a pass through doxygen fixing errors
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
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
/*
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005 INRIA
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
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#ifndef SCHEDULER_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#define SCHEDULER_H
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include <stdint.h>
2559
ab98bf436a17 do not use DefaultValues in simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1696
diff changeset
    25
#include "ns3/object.h"
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    27
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    29
class EventImpl;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    30
47
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    31
/**
3182
61fe7fe81ebd Doxygen organization
Tom Henderson <tomh@tomh.org>
parents: 2559
diff changeset
    32
 * \ingroup simulator
61fe7fe81ebd Doxygen organization
Tom Henderson <tomh@tomh.org>
parents: 2559
diff changeset
    33
 * \defgroup scheduler Scheduler
3222
f61c17b62fd1 bug 202: classes disappeared from doxygen output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3187
diff changeset
    34
 */
f61c17b62fd1 bug 202: classes disappeared from doxygen output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3187
diff changeset
    35
/**
f61c17b62fd1 bug 202: classes disappeared from doxygen output
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3187
diff changeset
    36
 * \ingroup scheduler
47
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    37
 * \brief Maintain the event list
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    38
 *
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    39
 * This base class specifies the interface used to maintain the 
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    40
 * event list. If you want to provide a new event list scheduler, 
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    41
 * you need to create a subclass of this base class and implement 
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    42
 * all the pure virtual methods defined here.
47
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    43
 *
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    44
 * The only tricky aspect of this API is the memory management of
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    45
 * the EventImpl pointer which is a member of the Event data structure.
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    46
 * The lifetime of this pointer is assumed to always be longer than
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    47
 * the lifetime of the Scheduler class which means that the caller
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    48
 * is responsible for ensuring that this invariant holds through
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    49
 * calling EventImpl::Ref and EventImpl::Unref at the right time.
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    50
 * Typically, ::Ref is called before Insert and ::Unref is called
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    51
 * after a call to one of the Remove methods.
47
48cb60c9eeba add documentation for scheduler factory
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 46
diff changeset
    52
 */
2559
ab98bf436a17 do not use DefaultValues in simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1696
diff changeset
    53
class Scheduler : public Object
ab98bf436a17 do not use DefaultValues in simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1696
diff changeset
    54
{
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
 public:
2559
ab98bf436a17 do not use DefaultValues in simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1696
diff changeset
    56
  static TypeId GetTypeId (void);
ab98bf436a17 do not use DefaultValues in simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1696
diff changeset
    57
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    58
  struct EventKey {
675
a5878de7d71c The header file ns3/cairo-wideint-private.h was added since the type int32_t was used.
Emmanuelle Laprise
parents: 194
diff changeset
    59
      uint64_t m_ts;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    60
      uint32_t m_uid;
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    61
  };
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    62
  struct Event {
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    63
    EventImpl *impl;
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    64
    EventKey key;
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    65
  };
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    67
  virtual ~Scheduler () = 0;
46
627df4c75852 cleanup the Scheduler API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 36
diff changeset
    68
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    69
  /**
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    70
   * \param ev event to store in the event list
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    71
   */
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
    72
  virtual void Insert (const Event &ev) = 0;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    73
  /**
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    74
   * \returns true if the event list is empty and false otherwise.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    75
   */
1009
adc3ac9baea8 optimize EventImpl refcounting
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1008
diff changeset
    76
  virtual bool IsEmpty (void) const = 0;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    77
  /**
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    78
   * \returns a pointer to the next earliest event. The caller
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    79
   *      takes ownership of the returned pointer.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    80
   *
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    81
   * This method cannot be invoked if the list is empty.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    82
   */
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    83
  virtual Event PeekNext (void) const = 0;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    84
  /**
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    85
   * This method cannot be invoked if the list is empty.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    86
   * Remove the next earliest event from the event list.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    87
   */
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    88
  virtual Event RemoveNext (void) = 0;
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    89
  /**
3997
a66553c56a8f make a pass through doxygen fixing errors
Craig Dowell <craigdo@ee.washington.edu>
parents: 3807
diff changeset
    90
   * \param ev the event to remove
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    91
   *
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    92
   * This methods cannot be invoked if the list is empty.
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
    93
   */
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3806
diff changeset
    94
  virtual void Remove (const Event &ev) = 0;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
3805
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
    97
/* Note the invariants which this function must provide:
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
    98
 * - irreflexibility: f (x,x) is false)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
    99
 * - antisymmetry: f(x,y) = !f(y,x)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   100
 * - transitivity: f(x,y) and f(y,z) => f(x,z)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   101
 */
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   102
inline bool operator < (const Scheduler::EventKey &a, const Scheduler::EventKey &b)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   103
{
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   104
  if (a.m_ts < b.m_ts)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   105
    {
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   106
      return true;
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   107
    }
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   108
  else if (a.m_ts == b.m_ts &&
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   109
           a.m_uid < b.m_uid)
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   110
    {
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   111
      return true;
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   112
    }
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   113
  else
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   114
    {
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   115
      return false;
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   116
    }
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   117
}
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   118
3806
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   119
inline bool operator < (const Scheduler::Event &a, const Scheduler::Event &b)
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   120
{
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   121
  return a.key < b.key;
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   122
}
d0381b7f3030 define Scheduler::Event and use it in Scheduler::Insert
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3805
diff changeset
   123
3805
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   124
902c5237743a reuse operator < (EventKey)
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3222
diff changeset
   125
} // namespace ns3
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
#endif /* SCHEDULER_H */