Consumer.hh revision 7021
15361Srstrong@cs.ucsd.edu 23671Sbinkertn@umich.edu/* 33671Sbinkertn@umich.edu * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 43671Sbinkertn@umich.edu * All rights reserved. 53671Sbinkertn@umich.edu * 63671Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without 73671Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are 83671Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright 93671Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer; 103671Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright 113671Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the 123671Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution; 133671Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its 143671Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from 153671Sbinkertn@umich.edu * this software without specific prior written permission. 163671Sbinkertn@umich.edu * 173671Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183671Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193671Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203671Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213671Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223671Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233671Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243671Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253671Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263671Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 273671Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283671Sbinkertn@umich.edu */ 293671Sbinkertn@umich.edu 303671Sbinkertn@umich.edu/* 313671Sbinkertn@umich.edu * $Id$ 323671Sbinkertn@umich.edu * 333671Sbinkertn@umich.edu * Description: This is the virtual base class of all classes that can 346028Ssteve.reinhardt@amd.com * be the targets of wakeup events. There is only two methods, 353671Sbinkertn@umich.edu * wakeup() and print() and no data members. 363671Sbinkertn@umich.edu * 373671Sbinkertn@umich.edu */ 383671Sbinkertn@umich.edu 393671Sbinkertn@umich.edu#ifndef CONSUMER_H 403671Sbinkertn@umich.edu#define CONSUMER_H 413671Sbinkertn@umich.edu 423671Sbinkertn@umich.edu#include <iostream> 433671Sbinkertn@umich.edu#include <set> 443671Sbinkertn@umich.edu 453671Sbinkertn@umich.edu#include "mem/ruby/common/Global.hh" 463671Sbinkertn@umich.edu#include "mem/ruby/eventqueue/RubyEventQueue.hh" 473671Sbinkertn@umich.edu 483671Sbinkertn@umich.educlass MessageBuffer; 493671Sbinkertn@umich.edu 503671Sbinkertn@umich.educlass Consumer { 513671Sbinkertn@umich.edupublic: 523671Sbinkertn@umich.edu // Constructors 533671Sbinkertn@umich.edu Consumer() { m_last_scheduled_wakeup = 0; m_last_wakeup = 0; } 543671Sbinkertn@umich.edu 553671Sbinkertn@umich.edu // Destructor 563671Sbinkertn@umich.edu virtual ~Consumer() { } 573671Sbinkertn@umich.edu 583671Sbinkertn@umich.edu // Public Methods - pure virtual methods 593671Sbinkertn@umich.edu void triggerWakeup(RubyEventQueue * eventQueue) 603671Sbinkertn@umich.edu { 613671Sbinkertn@umich.edu Time time = eventQueue->getTime(); 623671Sbinkertn@umich.edu if (m_last_wakeup != time) { 633671Sbinkertn@umich.edu wakeup(); m_last_wakeup = time; 643671Sbinkertn@umich.edu } 653671Sbinkertn@umich.edu } 663671Sbinkertn@umich.edu virtual void wakeup() = 0; 673671Sbinkertn@umich.edu virtual void print(std::ostream& out) const = 0; 683671Sbinkertn@umich.edu const Time& getLastScheduledWakeup() const 693671Sbinkertn@umich.edu { 703671Sbinkertn@umich.edu return m_last_scheduled_wakeup; 713671Sbinkertn@umich.edu } 723671Sbinkertn@umich.edu void setLastScheduledWakeup(const Time& time) 733671Sbinkertn@umich.edu { 743671Sbinkertn@umich.edu m_last_scheduled_wakeup = time; 753671Sbinkertn@umich.edu } 763671Sbinkertn@umich.edu bool alreadyScheduled(Time time) 773671Sbinkertn@umich.edu { 783671Sbinkertn@umich.edu return (m_scheduled_wakeups.find(time) != m_scheduled_wakeups.end()); 793671Sbinkertn@umich.edu } 803671Sbinkertn@umich.edu void insertScheduledWakeupTime(Time time) 813671Sbinkertn@umich.edu { 823671Sbinkertn@umich.edu m_scheduled_wakeups.insert(time); 833671Sbinkertn@umich.edu } 843671Sbinkertn@umich.edu void removeScheduledWakeupTime(Time time) 853671Sbinkertn@umich.edu { 863671Sbinkertn@umich.edu assert(alreadyScheduled(time)); 873671Sbinkertn@umich.edu m_scheduled_wakeups.erase(time); 885361Srstrong@cs.ucsd.edu } 895361Srstrong@cs.ucsd.edu 905361Srstrong@cs.ucsd.eduprivate: 913671Sbinkertn@umich.edu // Private Methods 923671Sbinkertn@umich.edu 933671Sbinkertn@umich.edu // Data Members (m_ prefix) 943671Sbinkertn@umich.edu Time m_last_scheduled_wakeup; 953671Sbinkertn@umich.edu std::set<Time> m_scheduled_wakeups; 963671Sbinkertn@umich.edu Time m_last_wakeup; 973671Sbinkertn@umich.edu}; 983671Sbinkertn@umich.edu 993671Sbinkertn@umich.edu// Output operator declaration 1003671Sbinkertn@umich.eduinline extern 1013671Sbinkertn@umich.edustd::ostream& operator<<(std::ostream& out, const Consumer& obj); 1023671Sbinkertn@umich.edu 1033671Sbinkertn@umich.edu// ******************* Definitions ******************* 1043671Sbinkertn@umich.edu 1053671Sbinkertn@umich.edu// Output operator definition 1063671Sbinkertn@umich.eduinline extern 1073671Sbinkertn@umich.edustd::ostream& operator<<(std::ostream& out, const Consumer& obj) 1083671Sbinkertn@umich.edu{ 1093671Sbinkertn@umich.edu obj.print(out); 1104116Sgblack@eecs.umich.edu out << std::flush; 1114116Sgblack@eecs.umich.edu return out; 1123671Sbinkertn@umich.edu} 1133671Sbinkertn@umich.edu 1143671Sbinkertn@umich.edu#endif //CONSUMER_H 1153671Sbinkertn@umich.edu