src/simulator/realtime-simulator-impl.cc
author Guillaume Seguin <guillaume@segu.in>
Thu, 12 Nov 2009 13:19:35 +0100
changeset 5507 915abd2b907b
parent 5302 5ed72d440db4
child 5521 37c6c83d4252
permissions -rw-r--r--
Simulator::SetScheduler now takes an ObjectFactory
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     2
/*
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     3
 * Copyright (c) 2008 University of Washington
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     4
 *
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     8
 *
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    12
 * GNU General Public License for more details.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    13
 *
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    17
 */
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    18
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    19
#include "simulator.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    20
#include "realtime-simulator-impl.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    21
#include "wall-clock-synchronizer.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    22
#include "scheduler.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    23
#include "event-impl.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    24
#include "synchronizer.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    25
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    26
#include "ns3/ptr.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    27
#include "ns3/pointer.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    28
#include "ns3/assert.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    29
#include "ns3/fatal-error.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    30
#include "ns3/log.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    31
#include "ns3/system-mutex.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    32
#include "ns3/boolean.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    33
#include "ns3/enum.h"
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    34
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    35
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    36
#include <math.h>
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    37
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    38
NS_LOG_COMPONENT_DEFINE ("RealtimeSimulatorImpl");
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    39
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    40
namespace ns3 {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    41
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    42
NS_OBJECT_ENSURE_REGISTERED (RealtimeSimulatorImpl);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    43
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    44
TypeId
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    45
RealtimeSimulatorImpl::GetTypeId (void)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    46
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    47
  static TypeId tid = TypeId ("ns3::RealtimeSimulatorImpl")
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    48
    .SetParent<Object> ()
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    49
    .AddConstructor<RealtimeSimulatorImpl> ()
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    50
    .AddAttribute ("SynchronizationMode", 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    51
                   "What to do if the simulation cannot keep up with real time.",
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    52
                   EnumValue (SYNC_BEST_EFFORT),
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    53
                   MakeEnumAccessor (&RealtimeSimulatorImpl::SetSynchronizationMode),
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    54
                   MakeEnumChecker (SYNC_BEST_EFFORT, "BestEffort",
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    55
                                    SYNC_HARD_LIMIT, "HardLimit"))
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    56
    .AddAttribute ("HardLimit", 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    57
                   "Maximum acceptable real-time jitter (used in conjunction with SynchronizationMode=HardLimit)",
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    58
                   TimeValue (Seconds (0.1)),
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    59
                   MakeTimeAccessor (&RealtimeSimulatorImpl::m_hardLimit),
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    60
                   MakeTimeChecker ())
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    61
    ;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    62
  return tid;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    63
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    64
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    65
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    66
RealtimeSimulatorImpl::RealtimeSimulatorImpl ()
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    67
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    68
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    69
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    70
  m_stop = false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    71
  m_running = false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    72
  // uids are allocated from 4.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    73
  // uid 0 is "invalid" events
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    74
  // uid 1 is "now" events
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    75
  // uid 2 is "destroy" events
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    76
  m_uid = 4; 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    77
  // before ::Run is entered, the m_currentUid will be zero
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    78
  m_currentUid = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    79
  m_currentTs = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    80
  m_unscheduledEvents = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    81
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    82
  // Be very careful not to do anything that would cause a change or assignment
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    83
  // of the underlying reference counts of m_synchronizer or you will be sorry.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    84
  m_synchronizer = CreateObject<WallClockSynchronizer> ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    85
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    86
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    87
RealtimeSimulatorImpl::~RealtimeSimulatorImpl ()
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    88
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    89
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    90
  while (m_events->IsEmpty () == false)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    91
    {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
    92
      Scheduler::Event next = m_events->RemoveNext ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
    93
      next.impl->Unref ();
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    94
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    95
  m_events = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    96
  m_synchronizer = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    97
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    98
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
    99
void
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   100
RealtimeSimulatorImpl::Destroy ()
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   101
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   102
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   103
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   104
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   105
  // This function is only called with the private version "disconnected" from
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   106
  // the main simulator functions.  We rely on the user not calling 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   107
  // Simulator::Destroy while there is a chance that a worker thread could be
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   108
  // accessing the current instance of the private object.  In practice this
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   109
  // means shutting down the workers and doing a Join() before calling the
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   110
  // Simulator::Destroy().
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   111
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   112
  while (m_destroyEvents.empty () == false) 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   113
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   114
      Ptr<EventImpl> ev = m_destroyEvents.front ().PeekEventImpl ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   115
      m_destroyEvents.pop_front ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   116
      NS_LOG_LOGIC ("handle destroy " << ev);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   117
      if (ev->IsCancelled () == false)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   118
        {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   119
          ev->Invoke ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   120
        }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   121
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   122
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   123
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   124
void
5507
915abd2b907b Simulator::SetScheduler now takes an ObjectFactory
Guillaume Seguin <guillaume@segu.in>
parents: 5302
diff changeset
   125
RealtimeSimulatorImpl::SetScheduler (ObjectFactory schedulerFactory)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   126
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   127
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   128
5507
915abd2b907b Simulator::SetScheduler now takes an ObjectFactory
Guillaume Seguin <guillaume@segu.in>
parents: 5302
diff changeset
   129
  Ptr<Scheduler> scheduler = schedulerFactory.Create<Scheduler> ();
915abd2b907b Simulator::SetScheduler now takes an ObjectFactory
Guillaume Seguin <guillaume@segu.in>
parents: 5302
diff changeset
   130
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   131
  { 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   132
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   133
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   134
    if (m_events != 0)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   135
      {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   136
        while (m_events->IsEmpty () == false)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   137
          {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   138
            Scheduler::Event next = m_events->RemoveNext ();
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   139
            scheduler->Insert (next);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   140
          }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   141
      }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   142
    m_events = scheduler;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   143
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   144
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   145
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   146
void
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   147
RealtimeSimulatorImpl::ProcessOneEvent (void)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   148
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   149
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   150
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   151
  // The idea here is to wait until the next event comes due.  In the case of
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   152
  // a realtime simulation, we want real time to be consumed between events.  
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   153
  // It is the realtime synchronizer that causes real time to be consumed by
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   154
  // doing some kind of a wait.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   155
  //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   156
  // We need to be able to have external events (such as a packet reception event)
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   157
  // cause us to re-evaluate our state.  The way this works is that the synchronizer
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   158
  // gets interrupted and returs.  So, there is a possibility that things may change
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   159
  // out from under us dynamically.  In this case, we need to re-evaluate how long to 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   160
  // wait in a for-loop until we have waited sucessfully (until a timeout) for the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   161
  // event at the head of the event list.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   162
  //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   163
  // m_synchronizer->Synchronize will return true if the wait was completed without 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   164
  // interruption, otherwise it will return false indicating that something has changed
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   165
  // out from under us.  If we sit in the for-loop trying to synchronize until 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   166
  // Synchronize() returns true, we will have successfully synchronized the execution 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   167
  // time of the next event with the wall clock time of the synchronizer.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   168
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   169
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   170
  for (;;) 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   171
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   172
      uint64_t tsDelay = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   173
      uint64_t tsNext = 0;
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   174
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   175
      //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   176
      // It is important to understand that m_currentTs is interpreted only as the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   177
      // timestamp  of the last event we executed.  Current time can a bit of a 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   178
      // slippery concept in realtime mode.  What we have here is a discrete event 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   179
      // simulator, so the last event is, by defintion, executed entirely at a single
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   180
      //  discrete time.  This is the definition of m_currentTs.  It really has 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   181
      // nothing to do with the current real time, except that we are trying to arrange
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   182
      // that at the instant of the beginning of event execution, the current real time
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   183
      // and m_currentTs coincide.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   184
      //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   185
      // We use tsNow as the indication of the current real time.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   186
      //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   187
      uint64_t tsNow;
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   188
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   189
      { 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   190
        CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   191
        //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   192
        // Since we are in realtime mode, the time to delay has got to be the 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   193
        // difference between the current realtime and the timestamp of the next 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   194
        // event.  Since m_currentTs is actually the timestamp of the last event we 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   195
        // executed, it's not particularly meaningful for us here since real time has
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   196
        // certainly elapsed since it was last updated.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   197
        //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   198
        // It is possible that the current realtime has drifted past the next event
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   199
        // time so we need to be careful about that and not delay in that case.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   200
        //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   201
        NS_ASSERT_MSG (m_synchronizer->Realtime (), 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   202
          "RealtimeSimulatorImpl::ProcessOneEvent (): Synchronizer reports not Realtime ()");
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   203
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   204
        //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   205
        // tsNow is set to the normalized current real time.  When the simulation was
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   206
        // started, the current real time was effectively set to zero; so tsNow is
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   207
        // the current "real" simulation time.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   208
        //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   209
        // tsNext is the simulation time of the next event we want to execute.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   210
        //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   211
        tsNow = m_synchronizer->GetCurrentRealtime ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   212
        tsNext = NextTs ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   213
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   214
        //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   215
        // tsDelay is therefore the real time we need to delay in order to bring the
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   216
        // real time in sync with the simulation time.  If we wait for this amount of
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   217
        // real time, we will accomplish moving the simulation time at the same rate
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   218
        // as the real time.  This is typically called "pacing" the simulation time.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   219
        //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   220
        // We do have to be careful if we are falling behind.  If so, tsDelay must be
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   221
        // zero.  If we're late, don't dawdle.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   222
        //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   223
        if (tsNext <= tsNow)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   224
          {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   225
            tsDelay = 0;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   226
          }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   227
        else
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   228
          {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   229
            tsDelay = tsNext - tsNow;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   230
          }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   231
      
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   232
        //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   233
        // We've figured out how long we need to delay in order to pace the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   234
        // simulation time with the real time.  We're going to sleep, but need
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   235
        // to work with the synchronizer to make sure we're awakened if something 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   236
        // external happens (like a packet is received).  This next line resets
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   237
        // the synchronizer so that any future event will cause it to interrupt.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   238
        //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   239
        m_synchronizer->SetCondition (false);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   240
      }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   241
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   242
      //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   243
      // We have a time to delay.  This time may actually not be valid anymore
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   244
      // since we released the critical section immediately above, and a real-time
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   245
      // ScheduleReal or ScheduleRealNow may have snuck in, well, between the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   246
      // closing brace above and this comment so to speak.  If this is the case, 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   247
      // that schedule operation will have done a synchronizer Signal() that 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   248
      // will set the condition variable to true and cause the Synchronize call 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   249
      // below to return immediately.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   250
      //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   251
      // It's easiest to understand if you just consider a short tsDelay that only
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   252
      // requires a SpinWait down in the synchronizer.  What will happen is that 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   253
      // whan Synchronize calls SpinWait, SpinWait will look directly at its 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   254
      // condition variable.  Note that we set this condition variable to false 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   255
      // inside the critical section above. 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   256
      //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   257
      // SpinWait will go into a forever loop until either the time has expired or
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   258
      // until the condition variable becomes true.  A true condition indicates that
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   259
      // the wait should stop.  The condition is set to true by one of the Schedule
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   260
      // methods of the simulator; so if we are in a wait down in Synchronize, and
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   261
      // a Simulator::ScheduleReal is done, the wait down in Synchronize will exit and
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   262
      // Synchronize will return false.  This means we have not actually synchronized
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   263
      // to the event expiration time.  If no real-time schedule operation is done
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   264
      // while down in Synchronize, the wait will time out and Synchronize will return 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   265
      // true.  This indicates that we have synchronized to the event time.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   266
      //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   267
      // So we need to stay in this for loop, looking for the next event timestamp and 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   268
      // attempting to sleep until its due.  If we've slept until the timestamp is due, 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   269
      // Synchronize returns true and we break out of the sync loop.  If an external
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   270
      // event happens that requires a re-schedule, Synchronize returns false and
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   271
      // we re-evaluate our timing by continuing in the loop.  
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   272
      //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   273
      // It is expected that tsDelay become shorter as external events interrupt our
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   274
      // waits.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   275
      //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   276
      if (m_synchronizer->Synchronize (tsNow, tsDelay))
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   277
        {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   278
          NS_LOG_LOGIC ("Interrupted ...");
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   279
          break;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   280
        }
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   281
 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   282
      //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   283
      // If we get to this point, we have been interrupted during a wait by a real-time
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   284
      // schedule operation.  This means all bets are off regarding tsDelay and we need
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   285
      // to re-evaluate what it is we want to do.  We'll loop back around in the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   286
      // for-loop and start again from scratch.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   287
      //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   288
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   289
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   290
  //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   291
  // If we break out of the for-loop above, we have waited until the time specified
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   292
  // by the event that was at the head of the event list when we started the process.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   293
  // Since there is a bunch of code that was executed outside a critical section (the
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   294
  // Synchronize call) we cannot be sure that the event at the head of the event list
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   295
  // is the one we think it is.  What we can be sure of is that it is time to execute
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   296
  // whatever event is at the head of this list if the list is in time order.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   297
  //
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   298
  Scheduler::Event next;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   299
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   300
  { 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   301
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   302
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   303
    // 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   304
    // We do know we're waiting for an event, so there had better be an event on the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   305
    // event queue.  Let's pull it off.  When we release the critical section, the
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   306
    // event we're working on won't be on the list and so subsequent operations won't
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   307
    // mess with us.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   308
    //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   309
    NS_ASSERT_MSG (m_events->IsEmpty () == false, 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   310
      "RealtimeSimulatorImpl::ProcessOneEvent(): event queue is empty");
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   311
    next = m_events->RemoveNext ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   312
    --m_unscheduledEvents;
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   313
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   314
    //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   315
    // We cannot make any assumption that "next" is the same event we originally waited 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   316
    // for.  We can only assume that only that it must be due and cannot cause time 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   317
    // to move backward.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   318
    //
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   319
    NS_ASSERT_MSG (next.key.m_ts >= m_currentTs,
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   320
                   "RealtimeSimulatorImpl::ProcessOneEvent(): "
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   321
                   "next.GetTs() earlier than m_currentTs (list order error)");
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   322
    NS_LOG_LOGIC ("handle " << next.key.m_ts);
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   323
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   324
    // 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   325
    // Update the current simulation time to be the timestamp of the event we're 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   326
    // executing.  From the rest of the simulation's point of view, simulation time
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   327
    // is frozen until the next event is executed.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   328
    //
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   329
    m_currentTs = next.key.m_ts;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   330
    m_currentUid = next.key.m_uid;
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   331
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   332
    // 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   333
    // We're about to run the event and we've done our best to synchronize this
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   334
    // event execution time to real time.  Now, if we're in SYNC_HARD_LIMIT mode
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   335
    // we have to decide if we've done a good enough job and if we haven't, we've
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   336
    // been asked to commit ritual suicide.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   337
    //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   338
    // We check the simulation time against the current real time to make this
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   339
    // judgement.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   340
    //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   341
    if (m_synchronizationMode == SYNC_HARD_LIMIT)
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   342
      {
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   343
        uint64_t tsFinal = m_synchronizer->GetCurrentRealtime ();
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   344
        uint64_t tsJitter;
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   345
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   346
        if (tsFinal >= m_currentTs)
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   347
          {
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   348
            tsJitter = tsFinal - m_currentTs;
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   349
          }
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   350
        else
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   351
          {
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   352
            tsJitter = m_currentTs - tsFinal;
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   353
          }
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   354
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   355
        if (tsJitter > static_cast<uint64_t>(m_hardLimit.GetTimeStep ()))
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   356
          {
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   357
            NS_FATAL_ERROR ("RealtimeSimulatorImpl::ProcessOneEvent (): "
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   358
                            "Hard real-time limit exceeded (jitter = " << tsJitter << ")");
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   359
          }
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   360
      }
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   361
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   362
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   363
  //
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   364
  // We have got the event we're about to execute completely disentangled from the 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   365
  // event list so we can execute it outside a critical section without fear of someone
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   366
  // changing things out from under us.
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   367
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   368
  EventImpl *event = next.impl;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   369
  m_synchronizer->EventStart ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   370
  event->Invoke ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   371
  m_synchronizer->EventEnd ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   372
  event->Unref ();
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   373
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   374
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   375
bool 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   376
RealtimeSimulatorImpl::IsFinished (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   377
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   378
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   379
  bool rc;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   380
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   381
    CriticalSection cs (m_mutex);
4085
31945ecb17e2 Make Simulator::IsFinished () take into account the stop time. Needed to run custom simulation loops (see bug 375)
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 4057
diff changeset
   382
    rc = m_events->IsEmpty () || m_stop;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   383
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   384
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   385
  return rc;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   386
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   387
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   388
//
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   389
// Peeks into event list.  Should be called with critical section locked.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   390
//
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   391
uint64_t
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   392
RealtimeSimulatorImpl::NextTs (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   393
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   394
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   395
  NS_ASSERT_MSG (m_events->IsEmpty () == false, 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   396
    "RealtimeSimulatorImpl::NextTs(): event queue is empty");
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   397
  Scheduler::Event ev = m_events->PeekNext ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   398
  return ev.key.m_ts;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   399
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   400
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   401
//
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   402
// Calls NextTs().  Should be called with critical section locked.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   403
//
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   404
Time
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   405
RealtimeSimulatorImpl::Next (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   406
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   407
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   408
  return TimeStep (NextTs ());
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   409
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   410
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   411
void
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   412
RealtimeSimulatorImpl::Run (void)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   413
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   414
  NS_LOG_FUNCTION_NOARGS ();
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   415
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   416
  NS_ASSERT_MSG (m_running == false, 
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   417
                 "RealtimeSimulatorImpl::Run(): Simulator already running");
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   418
4057
a68a42e667f6 bug 459: Simulator::Run does nothing after Simulator::Stop is called
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4009
diff changeset
   419
  m_stop = false;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   420
  m_running = true;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   421
  m_synchronizer->SetOrigin (m_currentTs);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   422
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   423
  for (;;) 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   424
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   425
      bool done = false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   426
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   427
      {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   428
        CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   429
        //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   430
        // In all cases we stop when the event list is empty.  If you are doing a 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   431
        // realtime simulation and you want it to extend out for some time, you must
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   432
        // call StopAt.  In the realtime case, this will stick a placeholder event out
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   433
        // at the end of time.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   434
        //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   435
        if (m_stop || m_events->IsEmpty ())
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   436
          {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   437
            done = true;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   438
          }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   439
      }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   440
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   441
      if (done)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   442
        {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   443
          break;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   444
        }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   445
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   446
      ProcessOneEvent ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   447
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   448
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   449
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   450
  // If the simulator stopped naturally by lack of events, make a
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   451
  // consistency test to check that we didn't lose any events along the way.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   452
  //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   453
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   454
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   455
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   456
    NS_ASSERT_MSG (m_events->IsEmpty () == false || m_unscheduledEvents == 0,
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   457
      "RealtimeSimulatorImpl::Run(): Empty queue and unprocessed events");
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   458
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   459
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   460
  m_running = false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   461
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   462
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   463
bool
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   464
RealtimeSimulatorImpl::Running (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   465
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   466
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   467
  return m_running;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   468
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   469
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   470
bool
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   471
RealtimeSimulatorImpl::Realtime (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   472
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   473
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   474
  return m_synchronizer->Realtime ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   475
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   476
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   477
//
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   478
// This will run the first event on the queue without considering any realtime
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   479
// synchronization.  It's mainly implemented to allow simulations requiring
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   480
// the multithreaded ScheduleRealtimeNow() functions the possibility of driving
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   481
// the simulation from their own event loop.
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   482
//
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   483
// It is expected that if there are any realtime requirements, the responsibility
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   484
// for synchronizing with real time in an external event loop will be picked up
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   485
// by that loop.  For example, they may call Simulator::Next() to find the 
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   486
// execution time of the next event and wait for that time somehow -- then call
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   487
// RunOneEvent to fire the event.
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   488
// 
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   489
void
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   490
RealtimeSimulatorImpl::RunOneEvent (void)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   491
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   492
  NS_LOG_FUNCTION_NOARGS ();
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   493
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   494
  NS_ASSERT_MSG (m_running == false, 
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   495
                 "RealtimeSimulatorImpl::RunOneEvent(): An internal simulator event loop is running");
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   496
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   497
  EventImpl *event = 0;
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   498
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   499
  //
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   500
  // Run this in a critical section in case there's another thread around that
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   501
  // may be inserting things onto the event list.
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   502
  //
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   503
  {
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   504
    CriticalSection cs (m_mutex);
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   505
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   506
    Scheduler::Event next = m_events->RemoveNext ();
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   507
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   508
    NS_ASSERT (next.key.m_ts >= m_currentTs);
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   509
    --m_unscheduledEvents;
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   510
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   511
    NS_LOG_LOGIC ("handle " << next.key.m_ts);
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   512
    m_currentTs = next.key.m_ts;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   513
    m_currentUid = next.key.m_ts;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   514
    event = next.impl;
3802
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   515
  }
b796f3c38e3e implement a non-realtime version of RunOneEvent for realtime simulator and allow Run, Stop, Run
Craig Dowell <craigdo@ee.washington.edu>
parents: 3801
diff changeset
   516
  event->Invoke ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   517
  event->Unref ();
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   518
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   519
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   520
void 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   521
RealtimeSimulatorImpl::Stop (void)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   522
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   523
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   524
  m_stop = true;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   525
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   526
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   527
//
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   528
// Schedule an event for a _relative_ time in the future.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   529
//
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   530
EventId
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   531
RealtimeSimulatorImpl::Schedule (Time const &time, EventImpl *impl)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   532
{
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   533
  NS_LOG_FUNCTION (time << impl);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   534
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   535
  Scheduler::Event ev;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   536
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   537
    CriticalSection cs (m_mutex);
3796
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   538
    //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   539
    // This is the reason we had to bring the absolute time calcualtion in from the
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   540
    // simulator.h into the implementation.  Since the implementations may be 
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   541
    // multi-threaded, we need this calculation to be atomic.  You can see it is
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   542
    // here since we are running in a CriticalSection.
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   543
    //
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   544
    Time tAbsolute = Simulator::Now () + time;
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   545
    NS_ASSERT_MSG (tAbsolute.IsPositive (), "RealtimeSimulatorImpl::Schedule(): Negative time");
75c6a3d424d9 make simulator schedule calls explicitly relative throughout. fixes multithread problem in realtime simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3565
diff changeset
   546
    NS_ASSERT_MSG (tAbsolute >= TimeStep (m_currentTs), "RealtimeSimulatorImpl::Schedule(): time < m_currentTs");
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   547
    ev.impl = impl;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   548
    ev.key.m_ts = (uint64_t) tAbsolute.GetTimeStep ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   549
    ev.key.m_uid = m_uid;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   550
    m_uid++;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   551
    ++m_unscheduledEvents;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   552
    m_events->Insert (ev);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   553
    m_synchronizer->Signal ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   554
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   555
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   556
  return EventId (impl, ev.key.m_ts, ev.key.m_uid);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   557
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   558
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   559
EventId
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   560
RealtimeSimulatorImpl::ScheduleNow (EventImpl *impl)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   561
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   562
  NS_LOG_FUNCTION_NOARGS ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   563
  Scheduler::Event ev;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   564
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   565
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   566
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   567
    ev.impl = impl;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   568
    ev.key.m_ts = m_currentTs;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   569
    ev.key.m_uid = m_uid;
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   570
    m_uid++;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   571
    ++m_unscheduledEvents;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   572
    m_events->Insert (ev);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   573
    m_synchronizer->Signal ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   574
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   575
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   576
  return EventId (impl, ev.key.m_ts, ev.key.m_uid);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   577
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   578
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   579
Time
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   580
RealtimeSimulatorImpl::Now (void) const
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   581
{
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   582
  return TimeStep (m_currentTs);
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   583
}
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   584
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   585
//
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   586
// Schedule an event for a _relative_ time in the future.
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   587
//
3809
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   588
void
3816
edd4928b2046 remove realtime public API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3812
diff changeset
   589
RealtimeSimulatorImpl::ScheduleRealtime (Time const &time, EventImpl *impl)
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   590
{
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   591
  NS_LOG_FUNCTION (time << impl);
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   592
3809
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   593
  
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   594
  {
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   595
    CriticalSection cs (m_mutex);
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   596
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   597
    uint64_t ts = m_synchronizer->GetCurrentRealtime () + time.GetTimeStep ();
3816
edd4928b2046 remove realtime public API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3812
diff changeset
   598
    NS_ASSERT_MSG (ts >= m_currentTs, "RealtimeSimulatorImpl::ScheduleRealtime(): schedule for time < m_currentTs");
3809
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   599
    Scheduler::Event ev;
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   600
    ev.impl = impl;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   601
    ev.key.m_ts = ts;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   602
    ev.key.m_uid = m_uid;
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   603
    m_uid++;
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   604
    ++m_unscheduledEvents;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   605
    m_events->Insert (ev);
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   606
    m_synchronizer->Signal ();
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   607
  }
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   608
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   609
}
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   610
3809
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   611
void
3816
edd4928b2046 remove realtime public API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3812
diff changeset
   612
RealtimeSimulatorImpl::ScheduleRealtimeNow (EventImpl *impl)
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   613
{
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   614
  NS_LOG_FUNCTION_NOARGS ();
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   615
  {
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   616
    CriticalSection cs (m_mutex);
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   617
3800
804beebf1ba5 added test for m_running in ScheduleRealNow
Craig Dowell <craigdo@ee.washington.edu>
parents: 3799
diff changeset
   618
    //
804beebf1ba5 added test for m_running in ScheduleRealNow
Craig Dowell <craigdo@ee.washington.edu>
parents: 3799
diff changeset
   619
    // If the simulator is running, we're pacing and have a meaningful 
804beebf1ba5 added test for m_running in ScheduleRealNow
Craig Dowell <craigdo@ee.washington.edu>
parents: 3799
diff changeset
   620
    // realtime clock.  If we're not, then m_currentTs is were we stopped.
804beebf1ba5 added test for m_running in ScheduleRealNow
Craig Dowell <craigdo@ee.washington.edu>
parents: 3799
diff changeset
   621
    // 
804beebf1ba5 added test for m_running in ScheduleRealNow
Craig Dowell <craigdo@ee.washington.edu>
parents: 3799
diff changeset
   622
    uint64_t ts = m_running ? m_synchronizer->GetCurrentRealtime () : m_currentTs;
3816
edd4928b2046 remove realtime public API.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3812
diff changeset
   623
    NS_ASSERT_MSG (ts >= m_currentTs, "RealtimeSimulatorImpl::ScheduleRealtimeNow(): schedule for time < m_currentTs");
3809
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   624
    Scheduler::Event ev;
5e007004402e move MakeEvent out of Simulator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3808
diff changeset
   625
    ev.impl = impl;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   626
    ev.key.m_ts = ts;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   627
    ev.key.m_uid = m_uid;
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   628
    m_uid++;
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   629
    ++m_unscheduledEvents;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   630
    m_events->Insert (ev);
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   631
    m_synchronizer->Signal ();
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   632
  }
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   633
}
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   634
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   635
Time
3801
dc1f5e534e56 slight reorganization and naming change for added realtime methods
Craig Dowell <craigdo@ee.washington.edu>
parents: 3800
diff changeset
   636
RealtimeSimulatorImpl::RealtimeNow (void) const
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   637
{
3799
ceea04d07e60 it helps to remember to add function implementations
Craig Dowell <craigdo@ee.washington.edu>
parents: 3798
diff changeset
   638
  return TimeStep (m_synchronizer->GetCurrentRealtime ());
3798
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   639
}
898d8a14b88f add dangerous realtime scheduling methods in an intentionally harder to find and use way
Craig Dowell <craigdo@ee.washington.edu>
parents: 3796
diff changeset
   640
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   641
EventId
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   642
RealtimeSimulatorImpl::ScheduleDestroy (EventImpl *impl)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   643
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   644
  NS_LOG_FUNCTION_NOARGS ();
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   645
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   646
  EventId id;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   647
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   648
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   649
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   650
    //
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   651
    // Time doesn't really matter here (especially in realtime mode).  It is 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   652
    // overridden by the uid of 2 which identifies this as an event to be 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   653
    // executed at Simulator::Destroy time.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   654
    //
3808
ace932ee6eef avoid using Ptr<EventImpl>
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3807
diff changeset
   655
    id = EventId (Ptr<EventImpl> (impl, false), m_currentTs, 2);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   656
    m_destroyEvents.push_back (id);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   657
    m_uid++;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   658
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   659
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   660
  return id;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   661
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   662
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   663
Time 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   664
RealtimeSimulatorImpl::GetDelayLeft (const EventId &id) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   665
{
3561
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   666
  //
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   667
  // If the event has expired, there is no delay until it runs.  It is not the
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   668
  // case that there is a negative time until it runs.
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   669
  //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   670
  if (IsExpired (id))
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   671
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   672
      return TimeStep (0);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   673
    }
3561
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   674
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   675
  return TimeStep (id.GetTs () - m_currentTs);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   676
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   677
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   678
void
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   679
RealtimeSimulatorImpl::Remove (const EventId &id)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   680
{
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   681
  if (id.GetUid () == 2)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   682
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   683
      // destroy events.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   684
      for (DestroyEvents::iterator i = m_destroyEvents.begin (); 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   685
           i != m_destroyEvents.end (); 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   686
           i++)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   687
        {
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   688
          if (*i == id)
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   689
            {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   690
              m_destroyEvents.erase (i);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   691
              break;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   692
            }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   693
         }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   694
      return;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   695
    }
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   696
  if (IsExpired (id))
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   697
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   698
      return;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   699
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   700
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   701
  {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   702
    CriticalSection cs (m_mutex);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   703
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   704
    Scheduler::Event event;
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   705
    event.impl = id.PeekEventImpl ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   706
    event.key.m_ts = id.GetTs ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   707
    event.key.m_uid = id.GetUid ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   708
    
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   709
    m_events->Remove (event);
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   710
    --m_unscheduledEvents;
3807
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   711
    event.impl->Cancel ();
268b86ce5435 don't use EventId in Schedulers: use Scheduler::Event instead.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3802
diff changeset
   712
    event.impl->Unref ();
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   713
  }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   714
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   715
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   716
void
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   717
RealtimeSimulatorImpl::Cancel (const EventId &id)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   718
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   719
  if (IsExpired (id) == false)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   720
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   721
      id.PeekEventImpl ()->Cancel ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   722
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   723
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   724
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   725
bool
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   726
RealtimeSimulatorImpl::IsExpired (const EventId &ev) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   727
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   728
  if (ev.GetUid () == 2)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   729
    {
5302
5ed72d440db4 fix old bug: canceled destroy events are expired
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4552
diff changeset
   730
      if (ev.PeekEventImpl () == 0 ||
5ed72d440db4 fix old bug: canceled destroy events are expired
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4552
diff changeset
   731
          ev.PeekEventImpl ()->IsCancelled ())
5ed72d440db4 fix old bug: canceled destroy events are expired
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4552
diff changeset
   732
        {
5ed72d440db4 fix old bug: canceled destroy events are expired
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4552
diff changeset
   733
          return true;
5ed72d440db4 fix old bug: canceled destroy events are expired
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4552
diff changeset
   734
        }
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   735
      // destroy events.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   736
      for (DestroyEvents::const_iterator i = m_destroyEvents.begin (); 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   737
           i != m_destroyEvents.end (); i++)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   738
        {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   739
          if (*i == ev)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   740
            {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   741
              return false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   742
            }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   743
         }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   744
      return true;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   745
    }
3561
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   746
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   747
  //
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   748
  // If the time of the event is less than the current timestamp of the 
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   749
  // simulator, the simulator has gone past the invocation time of the 
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   750
  // event, so the statement ev.GetTs () < m_currentTs does mean that 
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   751
  // the event has been fired even in realtime mode.
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   752
  //
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   753
  // The same is true for the next line involving the m_currentUid.
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   754
  //
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   755
  if (ev.PeekEventImpl () == 0 ||
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   756
      ev.GetTs () < m_currentTs ||
3561
e388935fa948 ifdef out ability to feed real-time through simulator
Craig Dowell <craigdo@ee.washington.edu>
parents: 3560
diff changeset
   757
      (ev.GetTs () == m_currentTs && ev.GetUid () <= m_currentUid) ||
3560
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   758
      ev.PeekEventImpl ()->IsCancelled ()) 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   759
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   760
      return true;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   761
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   762
  else
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   763
    {
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   764
      return false;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   765
    }
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   766
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   767
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   768
Time 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   769
RealtimeSimulatorImpl::GetMaximumSimulationTime (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   770
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   771
  // XXX: I am fairly certain other compilers use other non-standard
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   772
  // post-fixes to indicate 64 bit constants.
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   773
  return TimeStep (0x7fffffffffffffffLL);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   774
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   775
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   776
void 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   777
RealtimeSimulatorImpl::SetSynchronizationMode (enum SynchronizationMode mode)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   778
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   779
  NS_LOG_FUNCTION (mode);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   780
  m_synchronizationMode = mode;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   781
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   782
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   783
RealtimeSimulatorImpl::SynchronizationMode
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   784
RealtimeSimulatorImpl::GetSynchronizationMode (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   785
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   786
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   787
  return m_synchronizationMode;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   788
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   789
  
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   790
void 
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   791
RealtimeSimulatorImpl::SetHardLimit (Time limit)
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   792
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   793
  NS_LOG_FUNCTION (limit);
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   794
  m_hardLimit = limit;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   795
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   796
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   797
Time
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   798
RealtimeSimulatorImpl::GetHardLimit (void) const
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   799
{
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   800
  NS_LOG_FUNCTION_NOARGS ();
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   801
  return m_hardLimit;
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   802
}
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   803
  
5aa65b1ea001 add realtime simulator and associated tests
Craig Dowell <craigdo@ee.washington.edu>
parents:
diff changeset
   804
}; // namespace ns3