fast_alloc.cc
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· CC 代码 · 共 196 行
CC
196 行
/* * Copyright (c) 2000, 2001, 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 K. Reinhardt *//* * This code was originally written by Steve Reinhardt as part of * the Wisconsin Wind Tunnel simulator. Relicensed as part of M5 * by permission. */#include <assert.h>#include "base/fast_alloc.hh"#if !NO_FAST_ALLOC#ifdef __GNUC__#pragma implementation#endifvoid *FastAlloc::freeLists[Num_Buckets];#ifdef FAST_ALLOC_STATSunsigned FastAlloc::newCount[Num_Buckets];unsigned FastAlloc::deleteCount[Num_Buckets];unsigned FastAlloc::allocCount[Num_Buckets];#endifvoid *FastAlloc::moreStructs(int bucket){ assert(bucket > 0 && bucket < Num_Buckets); int sz = bucket * Alloc_Quantum; const int nstructs = Num_Structs_Per_New; // how many to allocate? char *p = ::new char[nstructs * sz];#ifdef FAST_ALLOC_STATS ++allocCount[bucket];#endif freeLists[bucket] = p; for (int i = 0; i < (nstructs-2); ++i, p += sz) *(void **)p = p + sz; *(void **)p = 0; return (p + sz);}#ifdef FAST_ALLOC_DEBUG#include <typeinfo>#include <iostream>#include <iomanip>#include <map>#include <string>using namespace std;// count of in-use FastAlloc objectsint FastAlloc::numInUse;// dummy head & tail object for doubly linked list of in-use FastAlloc// objectsFastAlloc FastAlloc::inUseHead(&FastAlloc::inUseHead, &FastAlloc::inUseHead);// special constructor for dummy head: make inUsePrev & inUseNext// point to selfFastAlloc::FastAlloc(FastAlloc *prev, FastAlloc *next){ inUsePrev = prev; inUseNext = next;}// constructor: marks as in use, add to in-use listFastAlloc::FastAlloc(){ // mark this object in use inUse = true; // update count ++numInUse; // add to tail of list of in-use objects ("before" dummy head) FastAlloc *myNext = &inUseHead; FastAlloc *myPrev = inUseHead.inUsePrev; inUsePrev = myPrev; inUseNext = myNext; myPrev->inUseNext = this; myNext->inUsePrev = this;}// destructor: mark not in use, remove from in-use listFastAlloc::~FastAlloc(){ assert(inUse); inUse = false; --numInUse; assert(numInUse >= 0); // remove me from in-use list inUsePrev->inUseNext = inUseNext; inUseNext->inUsePrev = inUsePrev;}// summarize in-use listvoidFastAlloc::dump_summary(){ map<string, int> typemap; for (FastAlloc *p = inUseHead.inUseNext; p != &inUseHead; p = p->inUseNext) { ++typemap[typeid(*p).name()]; } map<string, int>::const_iterator mapiter; cout << " count type\n" << " ----- ----\n"; for (mapiter = typemap.begin(); mapiter != typemap.end(); ++mapiter) { cout << setw(6) << mapiter->second << " " << mapiter->first << endl; }}// show oldest n items on in-use listvoidFastAlloc::dump_oldest(int n){ // sanity check: don't want to crash the debugger if you forget to // pass in a parameter if (n < 0 || n > numInUse) { cout << "FastAlloc::dump_oldest: bad arg " << n << " (" << numInUse << " objects in use" << endl; return; } for (FastAlloc *p = inUseHead.inUsePrev; p != &inUseHead && n > 0; p = p->inUsePrev, --n) { cout << p << " " << typeid(*p).name() << endl; }}//// C interfaces to FastAlloc::dump_summary() and FastAlloc::dump_oldest().// gdb seems to have trouble with calling C++ functions directly.//fast_alloc_summary(){ FastAlloc::dump_summary();}fast_alloc_oldest(int n){ FastAlloc::dump_oldest(n);}#endif#endif // NO_FAST_ALLOC
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?