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

📄 superblock.cpp

📁 newos is new operation system
💻 CPP
字号:
///-*-C++-*-////////////////////////////////////////////////////////////////////// The Hoard Multiprocessor Memory Allocator// 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./////////////////////////////////////////////////////////////////////////////////*  superblock.cpp  ------------------------------------------------------------------------  The superblock class controls a number of blocks (which are  allocatable units of memory).  ------------------------------------------------------------------------  @(#) $Id: superblock.cpp,v 1.40 2000/03/21 18:19: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>  ========================================================================*///#include <new.h>#include <string.h>#include "arch-specific.h"#include "config.h"#include "heap.h"#include "processheap.h"#include "superblock.h"superblock::superblock (int numBlocks,	// The number of blocks in the sb.			int szclass,	// The size class of the blocks.			hoardHeap * o)	// The heap that "owns" this sb.  :#if HEAP_DEBUG    _magic (SUPERBLOCK_MAGIC),#endif    _sizeClass (szclass),    _numBlocks (numBlocks),    _numAvailable (0),    _fullness (0),    _freeList (NULL),    _owner (o),    _next (NULL),    _prev (NULL){  assert (_numBlocks >= 1);  // Determine the size of each block.  const int blksize =    hoardHeap::align (sizeof(block) + hoardHeap::sizeFromClass(_sizeClass));  // Make sure this size is in fact aligned.  assert ((blksize & hoardHeap::ALIGNMENT_MASK) == 0);  // Set the first block to just past this superblock header.  block * b    = (block *) hoardHeap::align ((unsigned long) (this + 1));  // Initialize all the blocks,  // and insert the block pointers into the linked list.  for (int i = 0; i < _numBlocks; i++) {    // Make sure the block is on a double-word boundary.    assert (((unsigned int) b & hoardHeap::ALIGNMENT_MASK) == 0);    new (b) block (this);    assert (b->getSuperblock() == this);    b->setNext (_freeList);    _freeList = b;    b = (block *) ((char *) b + blksize);  }  _numAvailable = _numBlocks;  computeFullness();  assert ((unsigned long) b <= hoardHeap::align (sizeof(superblock) + blksize * _numBlocks) + (unsigned long) this);  hoardLockInit (_upLock);}superblock * superblock::makeSuperblock (int sizeclass,					 processHeap * pHeap){  // We need to get more memory.  char * buf;  int numBlocks = hoardHeap::numBlocks(sizeclass);  // Compute how much memory we need.  unsigned long moreMemory;  if (numBlocks > 1) {    moreMemory = hoardHeap::SUPERBLOCK_SIZE;    assert (moreMemory >= hoardHeap::align(sizeof(superblock) + (hoardHeap::align (sizeof(block) + hoardHeap::sizeFromClass(sizeclass))) * numBlocks));    // Get some memory from the process heap.    buf = (char *) pHeap->getSuperblockBuffer();  } else {    // One object.    assert (numBlocks == 1);    size_t blksize = hoardHeap::align (sizeof(block) + hoardHeap::sizeFromClass(sizeclass));    moreMemory = hoardHeap::align (sizeof(superblock) + blksize);    // Get space from the system.    buf = (char *) hoardSbrk (moreMemory);  }  // Make sure that we actually got the memory.  if (buf == NULL) {    return 0;  }  buf = (char *) hoardHeap::align ((unsigned long) buf);  // Make sure this buffer is double-word aligned.  assert (buf == (char *) hoardHeap::align ((unsigned long) buf));  assert ((((unsigned long) buf) & hoardHeap::ALIGNMENT_MASK) == 0);  // Instantiate the new superblock in the buffer.  superblock * sb = new (buf) superblock (numBlocks, sizeclass, NULL);  return sb;}

⌨️ 快捷键说明

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