diff options
Diffstat (limited to 'src/sim/eventq_impl.hh')
-rw-r--r-- | src/sim/eventq_impl.hh | 28 |
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"); |