summaryrefslogtreecommitdiff
path: root/base/fast_alloc.hh
diff options
context:
space:
mode:
Diffstat (limited to 'base/fast_alloc.hh')
-rw-r--r--base/fast_alloc.hh214
1 files changed, 0 insertions, 214 deletions
diff --git a/base/fast_alloc.hh b/base/fast_alloc.hh
deleted file mode 100644
index 54e35f8e0..000000000
--- a/base/fast_alloc.hh
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2000-2001, 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * This code was originally written by Steve Reinhardt as part of
- * the Wisconsin Wind Tunnel simulator. Relicensed as part of M5
- * by permission.
- */
-
-#ifndef __FAST_ALLOC_H__
-#define __FAST_ALLOC_H__
-
-#include <stddef.h>
-
-// Fast structure allocator. Designed for small objects that are
-// frequently allocated and deallocated. This code is derived from the
-// 'alloc_struct' package used in WWT and Blizzard. C++ provides a
-// much nicer framework for the same optimization. The package is
-// implemented as a class, FastAlloc. Allocation and deletion are
-// performed using FastAlloc's new and delete operators. Any object
-// that derives from the FastAlloc class will transparently use this
-// allocation package.
-
-// The static allocate() and deallocate() methods can also be called
-// directly if desired.
-
-// In order for derived classes to call delete with the correct
-// structure size even when they are deallocated via a base-type
-// pointer, they must have a virtual destructor. It is sufficient for
-// FastAlloc to declare a virtual destructor (as it does); it is not
-// required for derived classes to declare their own destructor. The
-// compiler will automatically generate a virtual destructor for each
-// derived class. However, it is more efficient if each derived class
-// defines an inline destructor, so that the compiler can statically
-// collapse the destructor call chain back up the inheritance
-// hierarchy.
-
-// Uncomment this #define to track in-use objects
-// (for debugging memory leaks).
-//#define FAST_ALLOC_DEBUG
-
-// Uncomment this #define to count news, deletes, and chunk allocations
-// (by bucket).
-// #define FAST_ALLOC_STATS
-
-#include "config/no_fast_alloc.hh"
-
-#if NO_FAST_ALLOC
-
-class FastAlloc {
-};
-
-#else
-
-class FastAlloc {
- public:
-
- static void *allocate(size_t);
- static void deallocate(void *, size_t);
-
- void *operator new(size_t);
- void operator delete(void *, size_t);
-
-#ifdef FAST_ALLOC_DEBUG
- FastAlloc();
- FastAlloc(FastAlloc*,FastAlloc*); // for inUseHead, see below
- virtual ~FastAlloc();
-#else
- virtual ~FastAlloc() {}
-#endif
-
- private:
-
- // Max_Alloc_Size is the largest object that can be allocated with
- // this class. There's no fundamental limit, but this limits the
- // size of the freeLists array. Let's not make this really huge
- // like in Blizzard.
- static const int Max_Alloc_Size = 512;
-
- // Alloc_Quantum is the difference in size between adjacent
- // buckets in the free list array.
- static const int Log2_Alloc_Quantum = 3;
- static const int Alloc_Quantum = (1 << Log2_Alloc_Quantum);
-
- // Num_Buckets = bucketFor(Max_Alloc_Size) + 1
- static const int Num_Buckets =
- ((Max_Alloc_Size + Alloc_Quantum - 1) >> Log2_Alloc_Quantum) + 1;
-
- // when we call new() for more structures, how many should we get?
- static const int Num_Structs_Per_New = 20;
-
- static int bucketFor(size_t);
- static void *moreStructs(int bucket);
-
- static void *freeLists[Num_Buckets];
-
-#ifdef FAST_ALLOC_STATS
- static unsigned newCount[Num_Buckets];
- static unsigned deleteCount[Num_Buckets];
- static unsigned allocCount[Num_Buckets];
-#endif
-
-#ifdef FAST_ALLOC_DEBUG
- // per-object debugging fields
- bool inUse; // in-use flag
- FastAlloc *inUsePrev; // ptrs to build list of in-use objects
- FastAlloc *inUseNext;
-
- // static (global) debugging vars
- static int numInUse; // count in-use objects
- static FastAlloc inUseHead; // dummy head for list of in-use objects
-
- public:
- // functions to dump debugging info (see fast_alloc.cc for C
- // versions that might be more agreeable to call from gdb)
- static void dump_summary();
- static void dump_oldest(int n);
-#endif
-};
-
-
-inline
-int FastAlloc::bucketFor(size_t sz)
-{
- return (sz + Alloc_Quantum - 1) >> Log2_Alloc_Quantum;
-}
-
-
-inline
-void *FastAlloc::allocate(size_t sz)
-{
- int b;
- void *p;
-
- if (sz > Max_Alloc_Size)
- return (void *)::new char[sz];
-
- b = bucketFor(sz);
- p = freeLists[b];
-
- if (p)
- freeLists[b] = *(void **)p;
- else
- p = moreStructs(b);
-
-#ifdef FAST_ALLOC_STATS
- ++newCount[b];
-#endif
-
- return p;
-}
-
-
-inline
-void FastAlloc::deallocate(void *p, size_t sz)
-{
- int b;
-
- if (sz > Max_Alloc_Size)
- {
- ::delete [] (char *)p;
- return;
- }
-
- b = bucketFor(sz);
- *(void **)p = freeLists[b];
- freeLists[b] = p;
-#ifdef FAST_ALLOC_STATS
- ++deleteCount[b];
-#endif
-}
-
-
-inline
-void *FastAlloc::operator new(size_t sz)
-{
- return allocate(sz);
-}
-
-
-inline
-void FastAlloc::operator delete(void *p, size_t sz)
-{
- deallocate(p, sz);
-}
-
-#endif // NO_FAST_ALLOC
-
-#endif // __FAST_ALLOC_H__