diff options
author | Brad Beckmann <Brad.Beckmann@amd.com> | 2010-01-29 20:29:19 -0800 |
---|---|---|
committer | Brad Beckmann <Brad.Beckmann@amd.com> | 2010-01-29 20:29:19 -0800 |
commit | 4e5f4b5074a5f76c73e9ca94954b43cd1686866c (patch) | |
tree | ec74d20e995b55851774d3c37375a87f8dbd9e78 /src | |
parent | e15abd17f92db574dfcbf3798f6352712f897ebc (diff) | |
download | gem5-4e5f4b5074a5f76c73e9ca94954b43cd1686866c.tar.xz |
ruby: Converted the sequencer deadlock event to m5 eventq
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/ruby/eventqueue/RubyEventQueue.hh | 1 | ||||
-rw-r--r-- | src/mem/ruby/system/Sequencer.cc | 13 | ||||
-rw-r--r-- | src/mem/ruby/system/Sequencer.hh | 12 |
3 files changed, 18 insertions, 8 deletions
diff --git a/src/mem/ruby/eventqueue/RubyEventQueue.hh b/src/mem/ruby/eventqueue/RubyEventQueue.hh index 36aa4843e..f9b4aa060 100644 --- a/src/mem/ruby/eventqueue/RubyEventQueue.hh +++ b/src/mem/ruby/eventqueue/RubyEventQueue.hh @@ -79,6 +79,7 @@ public: // Public Methods Time getTime() const { return curTick/m_clock; } + Tick getClock() const { return m_clock; } void scheduleEvent(Consumer* consumer, Time timeDelta); void scheduleEventAbsolute(Consumer* consumer, Time timeAbs); void print(ostream& out) const; diff --git a/src/mem/ruby/system/Sequencer.cc b/src/mem/ruby/system/Sequencer.cc index ad219eab3..a5a6e3260 100644 --- a/src/mem/ruby/system/Sequencer.cc +++ b/src/mem/ruby/system/Sequencer.cc @@ -56,14 +56,13 @@ RubySequencerParams::create() } Sequencer::Sequencer(const Params *p) - : RubyPort(p) + : RubyPort(p), deadlockCheckEvent(this) { m_store_waiting_on_load_cycles = 0; m_store_waiting_on_store_cycles = 0; m_load_waiting_on_store_cycles = 0; m_load_waiting_on_load_cycles = 0; - m_deadlock_check_scheduled = false; m_outstanding_count = 0; m_max_outstanding_requests = 0; @@ -128,9 +127,8 @@ void Sequencer::wakeup() { assert(m_outstanding_count == total_outstanding); if (m_outstanding_count > 0) { // If there are still outstanding requests, keep checking - g_eventQueue_ptr->scheduleEvent(this, m_deadlock_threshold); - } else { - m_deadlock_check_scheduled = false; + schedule(deadlockCheckEvent, + (m_deadlock_threshold * g_eventQueue_ptr->getClock()) + curTick); } } @@ -198,9 +196,8 @@ bool Sequencer::insertRequest(SequencerRequest* request) { assert(m_outstanding_count == total_outstanding); // See if we should schedule a deadlock check - if (m_deadlock_check_scheduled == false) { - g_eventQueue_ptr->scheduleEvent(this, m_deadlock_threshold); - m_deadlock_check_scheduled = true; + if (deadlockCheckEvent.scheduled() == false) { + schedule(deadlockCheckEvent, m_deadlock_threshold); } Address line_addr(request->ruby_request.paddr); diff --git a/src/mem/ruby/system/Sequencer.hh b/src/mem/ruby/system/Sequencer.hh index 974b251f0..f24edbf74 100644 --- a/src/mem/ruby/system/Sequencer.hh +++ b/src/mem/ruby/system/Sequencer.hh @@ -128,6 +128,18 @@ private: int m_store_waiting_on_store_cycles; int m_load_waiting_on_store_cycles; int m_load_waiting_on_load_cycles; + + class SequencerWakeupEvent : public Event + { + Sequencer *m_sequencer_ptr; + + public: + SequencerWakeupEvent(Sequencer *_seq) : m_sequencer_ptr(_seq) {} + void process() { m_sequencer_ptr->wakeup(); } + const char *description() const { return "Sequencer deadlock check"; } + }; + + SequencerWakeupEvent deadlockCheckEvent; }; // Output operator declaration |