#include "Global.hh"
#include "MessageBufferNode.hh"
#include "Consumer.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "Message.hh"
#include "PrioHeap.hh"
#include "util.hh"
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/*
- * EventQueueNode.C
- *
- * Description: See EventQueueNode.h
- *
- * $Id: MessageBufferNode.C,v 3.1 2001/02/02 16:57:54 sorin Exp $
- *
- */
-
#include "MessageBufferNode.hh"
void MessageBufferNode::print(ostream& out) const
#define CONSUMER_H
#include "Global.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
class MessageBuffer;
#include "Global.hh"
#include "Debug.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
class Debug;
extern Debug* g_debug_ptr;
#include "Global.hh"
-EventQueue* g_eventQueue_ptr = NULL;
+RubyEventQueue* g_eventQueue_ptr = NULL;
RubySystem* g_system_ptr = NULL;
Debug* g_debug_ptr = NULL;
typedef int SwitchID;
typedef int LinkID;
-class EventQueue;
-extern EventQueue* g_eventQueue_ptr;
+class RubyEventQueue;
+extern RubyEventQueue* g_eventQueue_ptr;
class RubySystem;
extern RubySystem* g_system_ptr;
+++ /dev/null
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * 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.
- */
-
-/*
- * $Id$
- */
-
-#include "EventQueue.hh"
-#include "RubyConfig.hh"
-#include "Consumer.hh"
-#include "Profiler.hh"
-#include "System.hh"
-#include "PrioHeap.hh"
-#include "EventQueueNode.hh"
-
-// Class public method definitions
-
-EventQueue::EventQueue()
-{
- m_prio_heap_ptr = NULL;
- init();
-}
-
-EventQueue::~EventQueue()
-{
- delete m_prio_heap_ptr;
-}
-
-void EventQueue::init()
-{
- m_globalTime = 1;
- m_timeOfLastRecovery = 1;
- m_prio_heap_ptr = new PrioHeap<EventQueueNode>;
- m_prio_heap_ptr->init();
-}
-
-bool EventQueue::isEmpty() const
-{
- return (m_prio_heap_ptr->size() == 0);
-}
-
-void EventQueue::scheduleEventAbsolute(Consumer* consumer, Time timeAbs)
-{
- // Check to see if this is a redundant wakeup
- // Time time = timeDelta + m_globalTime;
- ASSERT(consumer != NULL);
- if (consumer->getLastScheduledWakeup() != timeAbs) {
- // This wakeup is not redundant
- EventQueueNode thisNode;
- thisNode.m_consumer_ptr = consumer;
- assert(timeAbs > m_globalTime);
- thisNode.m_time = timeAbs;
- m_prio_heap_ptr->insert(thisNode);
- consumer->setLastScheduledWakeup(timeAbs);
- }
-}
-
-void EventQueue::triggerEvents(Time t)
-{
- EventQueueNode thisNode;
-
- while(m_prio_heap_ptr->size() > 0 && m_prio_heap_ptr->peekMin().m_time <= t) {
- m_globalTime = m_prio_heap_ptr->peekMin().m_time;
- thisNode = m_prio_heap_ptr->extractMin();
- assert(thisNode.m_consumer_ptr != NULL);
- DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,*(thisNode.m_consumer_ptr));
- DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,thisNode.m_time);
- thisNode.m_consumer_ptr->triggerWakeup();
- }
- m_globalTime = t;
-}
-
-void EventQueue::triggerAllEvents()
-{
- // FIXME - avoid repeated code
- EventQueueNode thisNode;
-
- while(m_prio_heap_ptr->size() > 0) {
- m_globalTime = m_prio_heap_ptr->peekMin().m_time;
- thisNode = m_prio_heap_ptr->extractMin();
- assert(thisNode.m_consumer_ptr != NULL);
- DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,*(thisNode.m_consumer_ptr));
- DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,thisNode.m_time);
- thisNode.m_consumer_ptr->triggerWakeup();
- }
-}
-
-// Class private method definitions
-
-void
-EventQueue::print(ostream& out) const
-{
- out << "[Event Queue: " << *m_prio_heap_ptr << "]";
-}
+++ /dev/null
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * 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.
- */
-
-/*
- * $Id$
- *
- * Description: The EventQueue class implements an event queue which
- * can be trigger events, allowing our simulation to be event driven.
- *
- * Currently, the only event we support is a Consumer being signaled
- * by calling the consumer's wakeup() routine. Adding the event to
- * the queue does not require a virtual function call, though calling
- * wakeup() is a virtual function call.
- *
- * The method triggerEvents() is called with a global time. All
- * events which are before or at this time are triggered in timestamp
- * order. No ordering is enforced for events scheduled to occur at
- * the same time. Events scheduled to wakeup the same consumer at the
- * same time are combined into a single event.
- *
- * The method scheduleConsumerWakeup() is called with a global time
- * and a consumer pointer. The event queue will call the wakeup()
- * method of the consumer at the appropriate time.
- *
- * This implementation of EventQueue uses a dynamically sized array
- * managed as a heap. The algorithms used has O(lg n) for insert and
- * O(lg n) for extract minimum element. (Based on chapter 7 of Cormen,
- * Leiserson, and Rivest.) The array is dynamically sized and is
- * automatically doubled in size when necessary.
- *
- */
-
-#ifndef EVENTQUEUE_H
-#define EVENTQUEUE_H
-
-#include "Global.hh"
-#include "Vector.hh"
-
-class Consumer;
-template <class TYPE> class PrioHeap;
-class EventQueueNode;
-
-class EventQueue {
-public:
- // Constructors
- EventQueue();
-
- // Destructor
- ~EventQueue();
-
- // Public Methods
-
- Time getTime() const { return m_globalTime; }
- void scheduleEvent(Consumer* consumer, Time timeDelta) { scheduleEventAbsolute(consumer, timeDelta + m_globalTime); }
- void scheduleEventAbsolute(Consumer* consumer, Time timeAbs);
- void triggerEvents(Time t); // called to handle all events <= time t
- void triggerAllEvents();
- void print(ostream& out) const;
- bool isEmpty() const;
-
- Time getTimeOfLastRecovery() {return m_timeOfLastRecovery;}
- void setTimeOfLastRecovery(Time t) {m_timeOfLastRecovery = t;}
-
- // Private Methods
-private:
- // Private copy constructor and assignment operator
- void init();
- EventQueue(const EventQueue& obj);
- EventQueue& operator=(const EventQueue& obj);
-
- // Data Members (m_ prefix)
- PrioHeap<EventQueueNode>* m_prio_heap_ptr;
- Time m_globalTime;
- Time m_timeOfLastRecovery;
-};
-
-// Output operator declaration
-inline extern
-ostream& operator<<(ostream& out, const EventQueue& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-inline extern
-ostream& operator<<(ostream& out, const EventQueue& obj)
-{
- obj.print(out);
- out << flush;
- return out;
-}
-
-#endif //EVENTQUEUE_H
+++ /dev/null
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * 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.
- */
-
-/*
- * $Id$
- *
- */
-
-#include "EventQueueNode.hh"
-
-void EventQueueNode::print(ostream& out) const
-{
- out << "[";
- out << "Time=" << m_time;
- if (m_consumer_ptr != NULL) {
- out << " Consumer=" << m_consumer_ptr;
- } else {
- out << " Consumer=NULL";
- }
- out << "]";
-}
+++ /dev/null
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * 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.
- */
-
-/*
- * $Id$
- *
- */
-
-#ifndef EVENTQUEUENODE_H
-#define EVENTQUEUENODE_H
-
-#include "Global.hh"
-class Consumer;
-
-class EventQueueNode {
-public:
- // Constructors
- EventQueueNode() { m_time = 0; m_consumer_ptr = NULL; }
-
- // Destructor
- //~EventQueueNode();
-
- // Public Methods
- void print(ostream& out) const;
-
- // Assignment operator and copy constructor since the default
- // constructors confuse purify when long longs are present.
- EventQueueNode& operator=(const EventQueueNode& obj) {
- m_time = obj.m_time;
- m_consumer_ptr = obj.m_consumer_ptr;
- return *this;
- }
-
- EventQueueNode(const EventQueueNode& obj) {
- m_time = obj.m_time;
- m_consumer_ptr = obj.m_consumer_ptr;
- }
-private:
- // Private Methods
-
- // Default copy constructor and assignment operator
- // EventQueueNode(const EventQueueNode& obj);
-
- // Data Members (m_ prefix)
-public:
- Time m_time;
- Consumer* m_consumer_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const EventQueueNode& obj);
-
-// ******************* Definitions *******************
-
-inline extern bool node_less_then_eq(const EventQueueNode& n1, const EventQueueNode& n2);
-
-inline extern
-bool node_less_then_eq(const EventQueueNode& n1, const EventQueueNode& n2)
-{
- return (n1.m_time <= n2.m_time);
-}
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const EventQueueNode& obj)
-{
- obj.print(out);
- out << flush;
- return out;
-}
-
-#endif //EVENTQUEUENODE_H
+++ /dev/null
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * 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.
- */
-
-/*
- * $Id$
- *
- */
-
-#include "EventQueue.hh"
-#include "Consumer.hh"
-
-//static int global_counter = 0;
-
-class TestConsumer1 : public Consumer {
-public:
- TestConsumer1(int description) { m_description = description; }
- ~TestConsumer1() { }
- void wakeup() { cout << "Wakeup#1: " << m_description << endl; }
- // void wakeup() { global_counter++; }
- void print(ostream& out) const { out << "1:" << m_description << endl; }
-
-private:
- int m_description;
-};
-
-class TestConsumer2 : public Consumer {
-public:
- TestConsumer2(int description) { m_description = description; }
- ~TestConsumer2() { }
- void wakeup() { cout << "Wakeup#2: " << m_description << endl; }
- // void wakeup() { global_counter++; }
- void print(ostream& out) const { out << "2:" << m_description << endl; }
-private:
- int m_description;
-};
-
-int main()
-{
- EventQueue q;
- const int SIZE = 200;
- const int MAX_TIME = 10000;
- int numbers[SIZE];
- Consumer* consumers[SIZE];
-
- for (int i=0; i<SIZE; i++) {
- numbers[i] = random() % MAX_TIME;
- if (i%2 == 0) {
- consumers[i] = new TestConsumer1(i);
- } else {
- consumers[i] = new TestConsumer2(i);
- }
- }
-
- for(int i=0; i<SIZE; i++) {
- q.scheduleEvent(consumers[i], numbers[i]);
- }
-
- q.triggerEvents(MAX_TIME);
-
- for (int i=0; i<SIZE; i++) {
- delete consumers[i];
- }
-}
--- /dev/null
+
+/*
+ * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/*
+ * $Id$
+ */
+
+#include "RubyEventQueue.hh"
+#include "RubyConfig.hh"
+#include "Consumer.hh"
+#include "Profiler.hh"
+#include "System.hh"
+#include "PrioHeap.hh"
+#include "RubyEventQueueNode.hh"
+
+// Class public method definitions
+
+RubyEventQueue::RubyEventQueue()
+{
+ m_prio_heap_ptr = NULL;
+ init();
+}
+
+RubyEventQueue::~RubyEventQueue()
+{
+ delete m_prio_heap_ptr;
+}
+
+void RubyEventQueue::init()
+{
+ m_globalTime = 1;
+ m_timeOfLastRecovery = 1;
+ m_prio_heap_ptr = new PrioHeap<RubyEventQueueNode>;
+ m_prio_heap_ptr->init();
+}
+
+bool RubyEventQueue::isEmpty() const
+{
+ return (m_prio_heap_ptr->size() == 0);
+}
+
+void RubyEventQueue::scheduleEventAbsolute(Consumer* consumer, Time timeAbs)
+{
+ // Check to see if this is a redundant wakeup
+ // Time time = timeDelta + m_globalTime;
+ ASSERT(consumer != NULL);
+ if (consumer->getLastScheduledWakeup() != timeAbs) {
+ // This wakeup is not redundant
+ RubyEventQueueNode thisNode;
+ thisNode.m_consumer_ptr = consumer;
+ assert(timeAbs > m_globalTime);
+ thisNode.m_time = timeAbs;
+ m_prio_heap_ptr->insert(thisNode);
+ consumer->setLastScheduledWakeup(timeAbs);
+ }
+}
+
+void RubyEventQueue::triggerEvents(Time t)
+{
+ RubyEventQueueNode thisNode;
+
+ while(m_prio_heap_ptr->size() > 0 && m_prio_heap_ptr->peekMin().m_time <= t) {
+ m_globalTime = m_prio_heap_ptr->peekMin().m_time;
+ thisNode = m_prio_heap_ptr->extractMin();
+ assert(thisNode.m_consumer_ptr != NULL);
+ DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,*(thisNode.m_consumer_ptr));
+ DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,thisNode.m_time);
+ thisNode.m_consumer_ptr->triggerWakeup();
+ }
+ m_globalTime = t;
+}
+
+void RubyEventQueue::triggerAllEvents()
+{
+ // FIXME - avoid repeated code
+ RubyEventQueueNode thisNode;
+
+ while(m_prio_heap_ptr->size() > 0) {
+ m_globalTime = m_prio_heap_ptr->peekMin().m_time;
+ thisNode = m_prio_heap_ptr->extractMin();
+ assert(thisNode.m_consumer_ptr != NULL);
+ DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,*(thisNode.m_consumer_ptr));
+ DEBUG_EXPR(EVENTQUEUE_COMP,MedPrio,thisNode.m_time);
+ thisNode.m_consumer_ptr->triggerWakeup();
+ }
+}
+
+// Class private method definitions
+
+void
+RubyEventQueue::print(ostream& out) const
+{
+ out << "[Event Queue: " << *m_prio_heap_ptr << "]";
+}
--- /dev/null
+
+/*
+ * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/*
+ * $Id$
+ *
+ * Description: The EventQueue class implements an event queue which
+ * can be trigger events, allowing our simulation to be event driven.
+ *
+ * Currently, the only event we support is a Consumer being signaled
+ * by calling the consumer's wakeup() routine. Adding the event to
+ * the queue does not require a virtual function call, though calling
+ * wakeup() is a virtual function call.
+ *
+ * The method triggerEvents() is called with a global time. All
+ * events which are before or at this time are triggered in timestamp
+ * order. No ordering is enforced for events scheduled to occur at
+ * the same time. Events scheduled to wakeup the same consumer at the
+ * same time are combined into a single event.
+ *
+ * The method scheduleConsumerWakeup() is called with a global time
+ * and a consumer pointer. The event queue will call the wakeup()
+ * method of the consumer at the appropriate time.
+ *
+ * This implementation of EventQueue uses a dynamically sized array
+ * managed as a heap. The algorithms used has O(lg n) for insert and
+ * O(lg n) for extract minimum element. (Based on chapter 7 of Cormen,
+ * Leiserson, and Rivest.) The array is dynamically sized and is
+ * automatically doubled in size when necessary.
+ *
+ */
+
+#ifndef RUBYEVENTQUEUE_H
+#define RUBYEVENTQUEUE_H
+
+#include "Global.hh"
+#include "Vector.hh"
+
+class Consumer;
+template <class TYPE> class PrioHeap;
+class RubyEventQueueNode;
+
+class RubyEventQueue {
+public:
+ // Constructors
+ RubyEventQueue();
+
+ // Destructor
+ ~RubyEventQueue();
+
+ // Public Methods
+
+ Time getTime() const { return m_globalTime; }
+ void scheduleEvent(Consumer* consumer, Time timeDelta) { scheduleEventAbsolute(consumer, timeDelta + m_globalTime); }
+ void scheduleEventAbsolute(Consumer* consumer, Time timeAbs);
+ void triggerEvents(Time t); // called to handle all events <= time t
+ void triggerAllEvents();
+ void print(ostream& out) const;
+ bool isEmpty() const;
+
+ Time getTimeOfLastRecovery() {return m_timeOfLastRecovery;}
+ void setTimeOfLastRecovery(Time t) {m_timeOfLastRecovery = t;}
+
+ // Private Methods
+private:
+ // Private copy constructor and assignment operator
+ void init();
+ RubyEventQueue(const RubyEventQueue& obj);
+ RubyEventQueue& operator=(const RubyEventQueue& obj);
+
+ // Data Members (m_ prefix)
+ PrioHeap<RubyEventQueueNode>* m_prio_heap_ptr;
+ Time m_globalTime;
+ Time m_timeOfLastRecovery;
+};
+
+// Output operator declaration
+inline extern
+ostream& operator<<(ostream& out, const RubyEventQueue& obj);
+
+// ******************* Definitions *******************
+
+// Output operator definition
+inline extern
+ostream& operator<<(ostream& out, const RubyEventQueue& obj)
+{
+ obj.print(out);
+ out << flush;
+ return out;
+}
+
+#endif //EVENTQUEUE_H
--- /dev/null
+
+/*
+ * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/*
+ * $Id$
+ *
+ */
+
+#include "RubyEventQueueNode.hh"
+
+void RubyEventQueueNode::print(ostream& out) const
+{
+ out << "[";
+ out << "Time=" << m_time;
+ if (m_consumer_ptr != NULL) {
+ out << " Consumer=" << m_consumer_ptr;
+ } else {
+ out << " Consumer=NULL";
+ }
+ out << "]";
+}
--- /dev/null
+
+/*
+ * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+ * All rights reserved.
+ *
+ * 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.
+ */
+
+/*
+ * $Id$
+ *
+ */
+
+#ifndef RUBYEVENTQUEUENODE_H
+#define RUBYEVENTQUEUENODE_H
+
+#include "Global.hh"
+class Consumer;
+
+class RubyEventQueueNode {
+public:
+ // Constructors
+ RubyEventQueueNode() { m_time = 0; m_consumer_ptr = NULL; }
+
+ // Destructor
+ //~RubyEventQueueNode();
+
+ // Public Methods
+ void print(ostream& out) const;
+
+ // Assignment operator and copy constructor since the default
+ // constructors confuse purify when long longs are present.
+ RubyEventQueueNode& operator=(const RubyEventQueueNode& obj) {
+ m_time = obj.m_time;
+ m_consumer_ptr = obj.m_consumer_ptr;
+ return *this;
+ }
+
+ RubyEventQueueNode(const RubyEventQueueNode& obj) {
+ m_time = obj.m_time;
+ m_consumer_ptr = obj.m_consumer_ptr;
+ }
+private:
+ // Private Methods
+
+ // Default copy constructor and assignment operator
+ // RubyEventQueueNode(const RubyEventQueueNode& obj);
+
+ // Data Members (m_ prefix)
+public:
+ Time m_time;
+ Consumer* m_consumer_ptr;
+};
+
+// Output operator declaration
+ostream& operator<<(ostream& out, const RubyEventQueueNode& obj);
+
+// ******************* Definitions *******************
+
+inline extern bool node_less_then_eq(const RubyEventQueueNode& n1, const RubyEventQueueNode& n2);
+
+inline extern
+bool node_less_then_eq(const RubyEventQueueNode& n1, const RubyEventQueueNode& n2)
+{
+ return (n1.m_time <= n2.m_time);
+}
+
+// Output operator definition
+extern inline
+ostream& operator<<(ostream& out, const RubyEventQueueNode& obj)
+{
+ obj.print(out);
+ out << flush;
+ return out;
+}
+
+#endif //EVENTQUEUENODE_H
*/
#include "Global.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "System.hh"
#include "Debug.hh"
#include "Profiler.hh"
DEBUG_OUTPUT_FILENAME );
cout << "Creating event queue..." << endl;
- g_eventQueue_ptr = new EventQueue;
+ g_eventQueue_ptr = new RubyEventQueue;
cout << "Creating event queue done" << endl;
cout << "Creating system..." << endl;
#include "OutVcState_d.hh"
#include "NetworkConfig.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
OutVcState_d::OutVcState_d(int id)
{
*/
#include "StoreTrace.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
bool StoreTrace::s_init = false; // Total number of store lifetimes of all lines
int64 StoreTrace::s_total_samples = 0; // Total number of store lifetimes of all lines
#include "CacheRecorder.hh"
#include "TraceRecord.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "PrioHeap.hh"
#include "gzstream.hh"
#include "Tracer.hh"
#include "TraceRecord.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "PrioHeap.hh"
#include "System.hh"
#include "Global.hh"
#include "System.hh"
#include "OpalInterface.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "mf_api.hh"
#include "interface.hh"
#include "Sequencer.hh"
#include "Global.hh"
#include "RefCnt.hh"
#include "RefCountable.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
class Message;
typedef RefCnt<Message> MsgPtr;
* */
/*
- * EventQueueNode.h
- *
* Description:
* This structure records everything known about a single
* memory request that is queued in the memory controller.
* It is created when the memory request first arrives
* at a memory controller and is deleted when the underlying
* message is enqueued to be sent back to the directory.
- *
- * $Id: MemoryNode.h,v 3.3 2003/12/04 15:01:34 xu Exp $
- *
*/
#ifndef MEMORYNODE_H
#include "System.hh"
#include "Driver.hh"
#include "Vector.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "AddressProfiler.hh"
#include "Sequencer.hh"
#include "SubBlock.hh"
#include "Global.hh"
#include "TimerTable.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
TimerTable::TimerTable(Chip* chip_ptr)
{
#include "Global.hh"
#include "System.hh"
#include "DeterministicDriver.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "SpecifiedGenerator.hh"
#include "DetermGETXGenerator.hh"
#include "DetermInvGenerator.hh"
#include "Global.hh"
#include "System.hh"
#include "RaceyDriver.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "RaceyPseudoThread.hh"
#include "SubBlock.hh"
#include "Global.hh"
#include "System.hh"
#include "SyntheticDriver.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
//#ifndef XACT_MEM
#include "RequestGenerator.hh"
//#endif
#include "Global.hh"
#include "System.hh"
#include "Tester.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "SubBlock.hh"
#include "Check.hh"
#include "Chip.hh"
*/
#include "main.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "RubyConfig.hh"
#include "test_framework.hh"
#include "OpalInterface.hh"
#include "init.hh"
#include "Tester.hh"
-#include "EventQueue.hh"
+#include "RubyEventQueue.hh"
#include "getopt.hh"
#include "Network.hh"
#include "CacheRecorder.hh"