Consumer.hh (7021:0b3c02da71b3) | Consumer.hh (7039:bc0b6ea676b5) |
---|---|
1 | |
2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; --- 13 unchanged lines hidden (view full) --- 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30/* | 1/* 2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 13 unchanged lines hidden (view full) --- 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29/* |
31 * $Id$ 32 * 33 * Description: This is the virtual base class of all classes that can 34 * be the targets of wakeup events. There is only two methods, 35 * wakeup() and print() and no data members. 36 * | 30 * This is the virtual base class of all classes that can be the 31 * targets of wakeup events. There is only two methods, wakeup() and 32 * print() and no data members. |
37 */ 38 | 33 */ 34 |
39#ifndef CONSUMER_H 40#define CONSUMER_H | 35#ifndef __MEM_RUBY_COMMON_CONSUMER_HH__ 36#define __MEM_RUBY_COMMON_CONSUMER_HH__ |
41 42#include <iostream> 43#include <set> 44 45#include "mem/ruby/common/Global.hh" 46#include "mem/ruby/eventqueue/RubyEventQueue.hh" 47 48class MessageBuffer; 49 | 37 38#include <iostream> 39#include <set> 40 41#include "mem/ruby/common/Global.hh" 42#include "mem/ruby/eventqueue/RubyEventQueue.hh" 43 44class MessageBuffer; 45 |
50class Consumer { 51public: 52 // Constructors 53 Consumer() { m_last_scheduled_wakeup = 0; m_last_wakeup = 0; } | 46class Consumer 47{ 48 public: 49 Consumer() 50 : m_last_scheduled_wakeup(0), m_last_wakeup(0) 51 { 52 } |
54 | 53 |
55 // Destructor 56 virtual ~Consumer() { } | 54 virtual 55 ~Consumer() 56 { } |
57 | 57 |
58 // Public Methods - pure virtual methods 59 void triggerWakeup(RubyEventQueue * eventQueue) 60 { 61 Time time = eventQueue->getTime(); 62 if (m_last_wakeup != time) { 63 wakeup(); m_last_wakeup = time; 64 } 65 } 66 virtual void wakeup() = 0; 67 virtual void print(std::ostream& out) const = 0; 68 const Time& getLastScheduledWakeup() const 69 { 70 return m_last_scheduled_wakeup; 71 } 72 void setLastScheduledWakeup(const Time& time) 73 { 74 m_last_scheduled_wakeup = time; 75 } 76 bool alreadyScheduled(Time time) 77 { 78 return (m_scheduled_wakeups.find(time) != m_scheduled_wakeups.end()); 79 } 80 void insertScheduledWakeupTime(Time time) 81 { 82 m_scheduled_wakeups.insert(time); 83 } 84 void removeScheduledWakeupTime(Time time) 85 { 86 assert(alreadyScheduled(time)); 87 m_scheduled_wakeups.erase(time); 88 } | 58 void 59 triggerWakeup(RubyEventQueue *eventQueue) 60 { 61 Time time = eventQueue->getTime(); 62 if (m_last_wakeup != time) { 63 wakeup(); 64 m_last_wakeup = time; 65 } 66 } |
89 | 67 |
90private: 91 // Private Methods | 68 virtual void wakeup() = 0; 69 virtual void print(std::ostream& out) const = 0; |
92 | 70 |
93 // Data Members (m_ prefix) 94 Time m_last_scheduled_wakeup; 95 std::set<Time> m_scheduled_wakeups; 96 Time m_last_wakeup; 97}; | 71 const Time& 72 getLastScheduledWakeup() const 73 { 74 return m_last_scheduled_wakeup; 75 } |
98 | 76 |
99// Output operator declaration 100inline extern 101std::ostream& operator<<(std::ostream& out, const Consumer& obj); | 77 void 78 setLastScheduledWakeup(const Time& time) 79 { 80 m_last_scheduled_wakeup = time; 81 } |
102 | 82 |
103// ******************* Definitions ******************* | 83 bool 84 alreadyScheduled(Time time) 85 { 86 return m_scheduled_wakeups.find(time) != m_scheduled_wakeups.end(); 87 } |
104 | 88 |
105// Output operator definition 106inline extern 107std::ostream& operator<<(std::ostream& out, const Consumer& obj) | 89 void 90 insertScheduledWakeupTime(Time time) 91 { 92 m_scheduled_wakeups.insert(time); 93 } 94 95 void 96 removeScheduledWakeupTime(Time time) 97 { 98 assert(alreadyScheduled(time)); 99 m_scheduled_wakeups.erase(time); 100 } 101 102 private: 103 Time m_last_scheduled_wakeup; 104 std::set<Time> m_scheduled_wakeups; 105 Time m_last_wakeup; 106}; 107 108inline std::ostream& 109operator<<(std::ostream& out, const Consumer& obj) |
108{ | 110{ |
109 obj.print(out); 110 out << std::flush; 111 return out; | 111 obj.print(out); 112 out << std::flush; 113 return out; |
112} 113 | 114} 115 |
114#endif //CONSUMER_H | 116#endif // __MEM_RUBY_COMMON_CONSUMER_HH__ |