summaryrefslogtreecommitdiff
path: root/src/sim/eventq_impl.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/sim/eventq_impl.hh')
-rw-r--r--src/sim/eventq_impl.hh28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/sim/eventq_impl.hh b/src/sim/eventq_impl.hh
index c53a4da77..360731d7b 100644
--- a/src/sim/eventq_impl.hh
+++ b/src/sim/eventq_impl.hh
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2012 The Regents of The University of Michigan
- * Copyright (c) 2012 Mark D. Hill and David A. Wood
+ * Copyright (c) 2012-2013 Mark D. Hill and David A. Wood
+ * Copyright (c) 2013 Advanced Micro Devices, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -38,19 +39,26 @@
#include "sim/eventq.hh"
inline void
-EventQueue::schedule(Event *event, Tick when)
+EventQueue::schedule(Event *event, Tick when, bool global)
{
assert(when >= getCurTick());
assert(!event->scheduled());
assert(event->initialized());
event->setWhen(when, this);
- insert(event);
+
+ // The check below is to make sure of two things
+ // a. a thread schedules local events on other queues through the asyncq
+ // b. a thread schedules global events on the asyncq, whether or not
+ // this event belongs to this eventq. This is required to maintain
+ // a total order amongst the global events. See global_event.{cc,hh}
+ // for more explanation.
+ if (inParallelMode && (this != curEventQueue() || global)) {
+ asyncInsert(event);
+ } else {
+ insert(event);
+ }
event->flags.set(Event::Scheduled);
- if (this == &mainEventQueue)
- event->flags.set(Event::IsMainQueue);
- else
- event->flags.clear(Event::IsMainQueue);
if (DTRACE(Event))
event->trace("scheduled");
@@ -61,6 +69,7 @@ EventQueue::deschedule(Event *event)
{
assert(event->scheduled());
assert(event->initialized());
+ assert(!inParallelMode || this == curEventQueue());
remove(event);
@@ -80,6 +89,7 @@ EventQueue::reschedule(Event *event, Tick when, bool always)
assert(when >= getCurTick());
assert(always || event->scheduled());
assert(event->initialized());
+ assert(!inParallelMode || this == curEventQueue());
if (event->scheduled())
remove(event);
@@ -88,10 +98,6 @@ EventQueue::reschedule(Event *event, Tick when, bool always)
insert(event);
event->flags.clear(Event::Squashed);
event->flags.set(Event::Scheduled);
- if (this == &mainEventQueue)
- event->flags.set(Event::IsMainQueue);
- else
- event->flags.clear(Event::IsMainQueue);
if (DTRACE(Event))
event->trace("rescheduled");