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

📄 scalableleaheap.h

📁 hoard内存管理器
💻 H
字号:
#ifndef _SCALABLELEAHEAP_H_#define _SCALABLELEAHEAP_H_#include "heaplayers.h"namespace ScalableHeapNS {	template <int NumHeaps, class SuperHeap>	class GlobalHeapWrapper : public SuperHeap {	public:		inline void * malloc (size_t sz) {			void * ptr = SuperHeap::malloc (sz);			if (ptr != NULL) {				assert (!isFree(ptr));			}			return ptr;		}		inline void free (void * ptr) {			// Set this object's heap to an unassigned heap (NumHeaps),			// then free it.			setHeap (ptr, NumHeaps); // This should be an unassigned heap number.			assert (getHeap(ptr) == NumHeaps);			setPrevHeap(getNext(ptr), NumHeaps);			assert (getPrevHeap(getNext(ptr)) == NumHeaps);			SuperHeap::free (ptr);		}	private:		inline int remove (void *);	};  template <int Threshold, class Heap1, class Heap2>  class TryHeap : public Heap2 {  public:	  TryHeap (void)		  : reserved (0)	  {}    inline void * malloc (size_t sz) {      void * ptr = heap1.malloc (sz);      if (ptr == NULL) {#if 1		// Get a big chunk.		size_t chunkSize = (Threshold / 2) > sz ? (Threshold / 2) : sz;		ptr = Heap2::malloc (chunkSize);		if (ptr == NULL) {			return NULL;		}		// Split it.		void * splitPiece = CoalesceHeap<Heap2>::split (ptr, sz);		assert (splitPiece != ptr);		assert (!isFree(ptr));		// Put the split piece on heap 1.		if (splitPiece != NULL) {			reserved += getSize(splitPiece);			heap1.free (splitPiece);		}#else		ptr = Heap2::malloc (sz);#endif	  } else {		  reserved -= getSize(ptr);	  }//	  assert (getHeap(ptr) == tid);      return ptr;    }    inline void free (void * ptr) {	  reserved += getSize(ptr);      heap1.free (ptr);      if (reserved > Threshold) {		// We've crossed the threshold.		// Free objects from heap 1 and give them to heap 2.		// Start big.		size_t sz = Threshold / 2;		while ((sz > sizeof(double)) && (reserved > Threshold / 2)) {		  void * p = NULL;		  while ((p == NULL) && (sz >= sizeof(double))) {			p = heap1.malloc (sz);			if (p == NULL) {			  sz >>= 1;			}		  }		  if (p != NULL) {			  reserved -= getSize(p);			  Heap2::free (p);		  }		}      }    }	  private:	inline int remove (void * ptr);#if 0	{		assert (0);		abort();	}#endif    Heap1 heap1;	int reserved;  };  template <int NumHeaps, int MmapThreshold, class BaseNullHeap, class BaseHeap>  class SmallHeap : public	  ScalableHeapNS::TryHeap<MmapThreshold,        MarkThreadHeap<NumHeaps, BaseNullHeap>,        MarkThreadHeap<NumHeaps, GlobalHeapWrapper<NumHeaps, BaseHeap> > > {};  template <int NumHeaps, int MmapThreshold, class BaseNullHeap, class BaseHeap>  class MTHeap :    public PHOThreadHeap<NumHeaps,		     LockedHeap<SmallHeap<NumHeaps, MmapThreshold, BaseNullHeap, BaseHeap> > > {};};  template <int NumHeaps, class BaseNullHeap, class BaseHeap, class Mmap>class ScalableHeap :public SelectMmapHeap<128 * 1024,         ScalableHeapNS::MTHeap<NumHeaps, 128 * 1024, BaseNullHeap, BaseHeap>,		    LockedHeap<Mmap> > {};#endif

⌨️ 快捷键说明

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