⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processheap.h

📁 newos is new operation system
💻 H
字号:
///-*-C++-*-////////////////////////////////////////////////////////////////////// Hoard: A Fast, Scalable, and Memory-Efficient Allocator//        for Shared-Memory Multiprocessors// Contact author: Emery Berger, http://www.cs.utexas.edu/users/emery//// Copyright (c) 1998-2000, The University of Texas at Austin.//// This library is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as// published by the Free Software Foundation, http://www.fsf.org.//// This library is distributed in the hope that it will be useful, but// WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU// Library General Public License for more details./////////////////////////////////////////////////////////////////////////////////*  processheap.h  ------------------------------------------------------------------------  We use one processHeap for the whole program.  ------------------------------------------------------------------------  @(#) $Id: processheap.h,v 1.73 2001/03/22 22:10:55 emery Exp $  ------------------------------------------------------------------------  Emery Berger                    | <http://www.cs.utexas.edu/users/emery>  Department of Computer Sciences |             <http://www.cs.utexas.edu>  University of Texas at Austin   |                <http://www.utexas.edu>  ========================================================================*/#ifndef _PROCESSHEAP_H_#define _PROCESSHEAP_H_#include "config.h"#include <stdio.h>//#include <stdlib.h>#include "arch-specific.h"#include "heap.h"#if USE_PRIVATE_HEAPS#include "privateheap.h"#define HEAPTYPE privateHeap#else#define HEAPTYPE threadHeap#include "threadheap.h"#endif#if HEAP_LOG#include "memstat.h"#include "log.h"#endifclass processHeap : public hoardHeap {public:  // Always grab at least this many superblocks' worth of memory which  // we parcel out.  enum { REFILL_NUMBER_OF_SUPERBLOCKS = 16 };  processHeap (void);  ~processHeap (void) {#if HEAP_STATS    stats();#endif  }  // Memory deallocation routines.  void free (void * ptr);  // Print out statistics information.  void stats (void);  // Get a thread heap index.  inline int getHeapIndex (void);  // Get the thread heap with index i.  inline HEAPTYPE& getHeap (int i);  // Extract a superblock.  inline superblock * acquire (const int c,			       hoardHeap * dest);  // Get space for a superblock.  inline char * getSuperblockBuffer (void);  // Insert a superblock.  inline void release (superblock * sb);#if HEAP_LOG  // Get the log for index i.  inline Log<MemoryRequest>& getLog (int i);#endif#if HEAP_FRAG_STATS  // Declare that we have allocated an object.  void setAllocated (int requestedSize,		     int actualSize);  // Declare that we have deallocated an object.  void setDeallocated (int requestedSize,		       int actualSize);  // Return the number of wasted bytes at the high-water mark  // (maxAllocated - maxRequested)  inline int getFragmentation (void);  int getMaxAllocated (void) {    return _maxAllocated;  }  int getInUseAtMaxAllocated (void) {    return _inUseAtMaxAllocated;  }  int getMaxRequested (void) {    return _maxRequested;  }#endifprivate:  // Hide the lock & unlock methods.  void lock (void) {    hoardHeap::lock();  }  void unlock (void) {    hoardHeap::unlock();  }  // Prevent copying and assignment.  processHeap (const processHeap&);  const processHeap& operator= (const processHeap&);  // The per-thread heaps.  HEAPTYPE theap[MAX_HEAPS];#if HEAP_FRAG_STATS  // Statistics required to compute fragmentation.  We cannot  // unintrusively keep track of these on a multiprocessor, because  // this would become a bottleneck.  int _currentAllocated;  int _currentRequested;  int _maxAllocated;  int _maxRequested;  int _inUseAtMaxAllocated;  int _fragmentation;  // A lock to protect these statistics.  hoardLockType _statsLock;#endif#if HEAP_LOG  Log<MemoryRequest> _log[MAX_HEAPS + 1];#endif  // A lock for the superblock buffer.  hoardLockType _bufferLock;  char * 	_buffer;  int 		_bufferCount;};HEAPTYPE& processHeap::getHeap (int i){  assert (i >= 0);  assert (i < MAX_HEAPS);  return theap[i];}#if HEAP_LOGLog<MemoryRequest>& processHeap::getLog (int i){  assert (i >= 0);  assert (i < MAX_HEAPS + 1);  return _log[i];}#endif// unused, moved to heap.cpp#if 0// Return ceil(log_2(num)).// num must be positive.static int lg (int num){  assert (num > 0);  int power = 0;  int n = 1;  // Invariant: 2^power == n.  while (n < num) {    n <<= 1;    power++;  }  return power;}#endif// Hash out the thread id to a heap and return an index to that heap.int processHeap::getHeapIndex (void) {  // Here we use the number of processors as the maximum number of heaps.  // In fact, for efficiency, we just round up to the highest power of two,  // times two.  int tid = hoardGetThreadID() & _numProcessorsMask;  assert (tid < MAX_HEAPS);  return tid;}superblock * processHeap::acquire (const int sizeclass,				   hoardHeap * dest){  lock ();  // Remove the superblock with the most free space.  superblock * maxSb = removeMaxSuperblock (sizeclass);  if (maxSb) {    maxSb->setOwner (dest);  }  unlock ();  return maxSb;}inline char * processHeap::getSuperblockBuffer (void){  char * buf;  hoardLock (_bufferLock);  if (_bufferCount == 0) {    _buffer = (char *) hoardSbrk (SUPERBLOCK_SIZE * REFILL_NUMBER_OF_SUPERBLOCKS);    _bufferCount = REFILL_NUMBER_OF_SUPERBLOCKS;  }  buf = _buffer;  _buffer += SUPERBLOCK_SIZE;  _bufferCount--;  hoardUnlock (_bufferLock);  return buf;}// Put a superblock back into our list of superblocks.void processHeap::release (superblock * sb){  assert (EMPTY_FRACTION * sb->getNumAvailable() > sb->getNumBlocks());  lock();  // Insert the superblock.  insertSuperblock (sb->getBlockSizeClass(), sb, this);  unlock();}#endif // _PROCESSHEAP_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -