This has three advantages. First, the data structure doesn't have to try to keep track of whether or not an event is already listed there. Second, it's easier to delete an item by storing an iterator for it when it gets inserted. Third, the ordering of events is not dependent on the arbitrary ordering of the set, it's bsaed on the fixed order the events get added to the list. One part of this change makes ScEvent-s keep track of what list they're on, and handle their own insertion and deletion when they're scheduled or descheduled. A side effect of that is that it's no longer safe to simply use a range based for loop to loop over all of an ScEvent and deschedule all its events or to run then (which deschedules them internally once they execute). That can be avoided by looping until the list is empty, and operating on the first element. As the first element is processed and removed from the list, the next element will become first and will get picked up in the next iteration. Change-Id: Icad51a63f153297c88e65f85d22ac721e6c571d8 Reviewed-on: https://gem5-review.googlesource.com/c/12456 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
92 lines
2.6 KiB
C++
92 lines
2.6 KiB
C++
/*
|
|
* Copyright 2018 Google, Inc.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met: redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer;
|
|
* redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution;
|
|
* neither the name of the copyright holders nor the names of its
|
|
* contributors may be used to endorse or promote products derived from
|
|
* this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
* Authors: Gabe Black
|
|
*/
|
|
|
|
#ifndef __SYSTEMC_CORE_SCHED_EVENT_HH__
|
|
#define __SYSTEMC_CORE_SCHED_EVENT_HH__
|
|
|
|
#include <functional>
|
|
#include <list>
|
|
|
|
#include "base/types.hh"
|
|
|
|
namespace sc_gem5
|
|
{
|
|
|
|
class ScEvent;
|
|
|
|
typedef std::list<ScEvent *> ScEvents;
|
|
|
|
class ScEvent
|
|
{
|
|
private:
|
|
std::function<void()> work;
|
|
Tick _when;
|
|
ScEvents *_events;
|
|
ScEvents::iterator _it;
|
|
|
|
friend class Scheduler;
|
|
|
|
void
|
|
schedule(ScEvents &events, Tick w)
|
|
{
|
|
when(w);
|
|
assert(!scheduled());
|
|
_events = &events;
|
|
_events->push_back(this);
|
|
_it = _events->end();
|
|
_it--;
|
|
}
|
|
|
|
void
|
|
deschedule()
|
|
{
|
|
assert(scheduled());
|
|
_events->erase(_it);
|
|
_events = nullptr;
|
|
}
|
|
public:
|
|
ScEvent(std::function<void()> work) :
|
|
work(work), _when(MaxTick), _events(nullptr)
|
|
{}
|
|
|
|
~ScEvent();
|
|
|
|
bool scheduled() { return _events != nullptr; }
|
|
ScEvents *scheduledOn() { return _events; }
|
|
|
|
void when(Tick w) { _when = w; }
|
|
Tick when() { return _when; }
|
|
|
|
void run() { deschedule(); work(); }
|
|
};
|
|
|
|
} // namespace sc_gem5
|
|
|
|
#endif // __SYSTEMC_CORE_SCHED_EVENT_HH__
|