From 38aa50bb49ac8621fe9cc6a85ad6f39a61c76bb3 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Fri, 18 Mar 2011 11:47:11 -0700 Subject: base: disable FastAlloc in debug builds by default FastAlloc's reuse policies can mask allocation bugs, so we typically want it disabled when debugging. Set FORCE_FAST_ALLOC to enable even when debugging, and set NO_FAST_ALLOC to disable even in non-debug builds. --- src/base/fast_alloc.cc | 156 +------------------------------------------------ 1 file changed, 2 insertions(+), 154 deletions(-) (limited to 'src/base/fast_alloc.cc') diff --git a/src/base/fast_alloc.cc b/src/base/fast_alloc.cc index 649f94be3..0736d26e2 100644 --- a/src/base/fast_alloc.cc +++ b/src/base/fast_alloc.cc @@ -38,7 +38,7 @@ #include "base/fast_alloc.hh" -#if !NO_FAST_ALLOC +#if USE_FAST_ALLOC #ifdef __GNUC__ #pragma implementation @@ -73,156 +73,4 @@ FastAlloc::moreStructs(int bucket) return (p + sz); } -#if FAST_ALLOC_DEBUG - -#include -#include -#include - -#include "base/cprintf.hh" -#include "sim/core.hh" // for curTick() - -using namespace std; - -// count of in-use FastAlloc objects -int FastAlloc::numInUse; - -// dummy head & tail object for doubly linked list of in-use FastAlloc -// objects -FastAlloc FastAlloc::inUseHead(&FastAlloc::inUseHead, &FastAlloc::inUseHead); - -// special constructor for dummy head: make inUsePrev & inUseNext -// point to self -FastAlloc::FastAlloc(FastAlloc *prev, FastAlloc *next) -{ - inUsePrev = prev; - inUseNext = next; -} - -// constructor: marks as in use, add to in-use list -FastAlloc::FastAlloc() -{ - // mark this object in use - inUse = true; - whenAllocated = curTick(); - - // 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 list -FastAlloc::~FastAlloc() -{ - assert(inUse); - inUse = false; - - --numInUse; - assert(numInUse >= 0); - - // remove me from in-use list - inUsePrev->inUseNext = inUseNext; - inUseNext->inUsePrev = inUsePrev; -} - - -// Note that in all the display functions below we suppress anything -// with a zero allocation timestamp... there are a bunch of static or -// quasi-static structures that get allocated during initialization -// and we generally don't care about them so this gets them out of the -// way. - -// summarize in-use list -void -FastAlloc::dump_summary() -{ - map typemap; - - for (FastAlloc *p = inUseHead.inUseNext; p != &inUseHead; p = p->inUseNext) - { - if (p->whenAllocated != 0) - ++typemap[typeid(*p).name()]; - } - - map::const_iterator mapiter; - - cprintf(" count type\n" - " ----- ----\n"); - for (mapiter = typemap.begin(); mapiter != typemap.end(); ++mapiter) - cprintf("%6d %s\n",mapiter->second, mapiter->first); -} - - -// show oldest n items on in-use list -void -FastAlloc::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) { - cprintf("FastAlloc::dump_oldest: bad arg %d (%d objects in use)\n", - n, numInUse); - return; - } - - for (FastAlloc *p = inUseHead.inUseNext; - p != &inUseHead && n > 0; - p = p->inUseNext, --n) { - if (p->whenAllocated != 0) - cprintf("%x %15d %s\n", p, p->whenAllocated, typeid(*p).name()); - } -} - - -// show oldest n items on in-use list for specified type -void -FastAlloc::dump_oldest_of_type(int n, const char *type_name) -{ - // sanity check: don't want to crash the debugger if you forget to - // pass in a parameter - if (n < 0 || n > numInUse) { - cprintf("FastAlloc::dump_oldest_of_type: bad arg %d " - "(%d objects in use)\n", - n, numInUse); - return; - } - - for (FastAlloc *p = inUseHead.inUseNext; - p != &inUseHead && n > 0; - p = p->inUseNext) { - if (p->whenAllocated != 0 && - strcmp(typeid(*p).name(), type_name) == 0) { - cprintf("%x %15d\n", p, p->whenAllocated); - --n; - } - } -} - - -// -// C interfaces to FastAlloc::dump_summary() and FastAlloc::dump_oldest(). -// gdb seems to have trouble with calling C++ functions directly. -// -void -fast_alloc_summary() -{ - FastAlloc::dump_summary(); -} - -void -fast_alloc_oldest(int n) -{ - FastAlloc::dump_oldest(n); -} - -#endif // FAST_ALLOC_DEBUG - -#endif // NO_FAST_ALLOC +#endif // USE_FAST_ALLOC -- cgit v1.2.3