sched_list.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 181 行
HH
181 行
/* * Copyright (c) 2002, 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Steven E. Raasch */#ifndef SCHED_LIST_HH#define SCHED_LIST_HH#include <list>#include "base/intmath.hh"#include "base/misc.hh"// Any types you use this class for must be covered here...namespace { void ClearEntry(int &i) { i = 0; }; void ClearEntry(unsigned &i) { i = 0; }; void ClearEntry(double &i) { i = 0; }; template <class T> void ClearEntry(std::list<T> &l) { l.clear(); };};//// this is a special list type that allows the user to insert elements at a// specified positive offset from the "current" element, but only allow them// be extracted from the "current" element//template <class T>class SchedList{ T *data_array; unsigned position; unsigned size; unsigned mask; public: SchedList(unsigned size); SchedList(void); void init(unsigned size); T &operator[](unsigned offset); void advance(void); void clear(void);};//// Constructor//template<class T>SchedList<T>::SchedList(unsigned _size){ size = _size; // size must be a power of two if (!isPowerOf2(size)) { panic("SchedList: size must be a power of two"); } if (size < 2) { panic("SchedList: you don't want a list that small"); } // calculate the bit mask for the modulo operation mask = size - 1; data_array = new T[size]; if (!data_array) { panic("SchedList: could not allocate memory"); } clear();}template<class T>SchedList<T>::SchedList(void){ data_array = 0; size = 0;}template<class T> voidSchedList<T>::init(unsigned _size){ size = _size; if (!data_array) { // size must be a power of two if (size & (size-1)) { panic("SchedList: size must be a power of two"); } if (size < 2) { panic("SchedList: you don't want a list that small"); } // calculate the bit mask for the modulo operation mask = size - 1; data_array = new T[size]; if (!data_array) { panic("SchedList: could not allocate memory"); } clear(); }}template<class T> voidSchedList<T>::advance(void){ ClearEntry(data_array[position]); // position = (++position % size); position = ++position & mask;}template<class T> voidSchedList<T>::clear(void){ for (unsigned i=0; i<size; ++i) { ClearEntry(data_array[i]); } position = 0;}template<class T> T&SchedList<T>::operator[](unsigned offset){ if (offset >= size) { panic("SchedList: can't access element beyond current pointer"); } // unsigned p = (position + offset) % size; unsigned p = (position + offset) & mask; return data_array[p];}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?