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