File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: #ifndef _KILIB_MEMORY_H_
dcdd144598 2011-02-23        kinaba: #define _KILIB_MEMORY_H_
dcdd144598 2011-02-23        kinaba: #include "types.h"
dcdd144598 2011-02-23        kinaba: #include "thread.h"
dcdd144598 2011-02-23        kinaba: #ifndef __ccdoc__
dcdd144598 2011-02-23        kinaba: namespace ki {
dcdd144598 2011-02-23        kinaba: #endif
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: // W版ではHeapAllocを直接呼び出すバージョンを使う
dcdd144598 2011-02-23        kinaba: //#if !defined(_UNICODE) && defined(SUPERTINY)
dcdd144598 2011-02-23        kinaba: //	#define USE_ORIGINAL_MEMMAN
dcdd144598 2011-02-23        kinaba: //#endif
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: // 小規模と見なすオブジェクトの最大サイズ
dcdd144598 2011-02-23        kinaba: #define SMALL_MAX 64
dcdd144598 2011-02-23        kinaba: // 一度に確保するヒープブロックのサイズ
dcdd144598 2011-02-23        kinaba: #define BLOCK_SIZ 4096
dcdd144598 2011-02-23        kinaba: // 内部実装
dcdd144598 2011-02-23        kinaba: struct MemBlock;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: //@{ @pkg ki.Memory //@}
dcdd144598 2011-02-23        kinaba: //@{
dcdd144598 2011-02-23        kinaba: //	メモリ割り当て・解放機構
dcdd144598 2011-02-23        kinaba: //
dcdd144598 2011-02-23        kinaba: //	SUPERTINYオプションを付けてコンパイルすると、標準の
dcdd144598 2011-02-23        kinaba: //	mallocやfreeを使えなくなるため、HeapAlloc等のAPIを
dcdd144598 2011-02-23        kinaba: //	直接呼び出す必要が出てきます。しかし、こいつらを本当に
dcdd144598 2011-02-23        kinaba: //	毎回直に呼んでいると、遅い。もうアホかと、バカかと、
dcdd144598 2011-02-23        kinaba: //	って勢いで遅い。そこで、主にnewで動的に小規模メモリを
dcdd144598 2011-02-23        kinaba: //	確保することに主眼を据えた簡単なアロケータを使うことにしました。
dcdd144598 2011-02-23        kinaba: //
dcdd144598 2011-02-23        kinaba: //	<a href="http://cseng.aw.com/book/0,3828,0201704315,00.html">loki</a>
dcdd144598 2011-02-23        kinaba: //	ライブラリほぼそのまんまな実装です。
dcdd144598 2011-02-23        kinaba: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class MemoryManager : public EzLockable
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: public:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@{ メモリ割り当て //@}
dcdd144598 2011-02-23        kinaba: 	void* Alloc( size_t siz );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	//@{ メモリ解放 //@}
dcdd144598 2011-02-23        kinaba: 	void DeAlloc( void* ptr, size_t siz );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: #ifdef USE_ORIGINAL_MEMMAN
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 	struct FixedSizeMemBlockPool
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		void Construct( byte siz );
dcdd144598 2011-02-23        kinaba: 		void Destruct();
dcdd144598 2011-02-23        kinaba: 		void*  Alloc();
dcdd144598 2011-02-23        kinaba: 		void DeAlloc( void* ptr );
dcdd144598 2011-02-23        kinaba: 		bool isValid();
dcdd144598 2011-02-23        kinaba: 	private:
dcdd144598 2011-02-23        kinaba: 		MemBlock* blocks_;
dcdd144598 2011-02-23        kinaba: 		int       blockNum_;
dcdd144598 2011-02-23        kinaba: 		int       blockNumReserved_;
dcdd144598 2011-02-23        kinaba: 		byte      fixedSize_;
dcdd144598 2011-02-23        kinaba: 		byte      numPerBlock_;
dcdd144598 2011-02-23        kinaba: 		int       lastA_;
dcdd144598 2011-02-23        kinaba: 		int       lastDA_;
dcdd144598 2011-02-23        kinaba: 	};
dcdd144598 2011-02-23        kinaba: 	FixedSizeMemBlockPool pools_[ SMALL_MAX ];
dcdd144598 2011-02-23        kinaba: #endif
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	MemoryManager();
dcdd144598 2011-02-23        kinaba: 	~MemoryManager();
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	static MemoryManager* pUniqueInstance_;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: private:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	friend void APIENTRY Startup();
dcdd144598 2011-02-23        kinaba: 	friend inline MemoryManager& mem();
dcdd144598 2011-02-23        kinaba: 	NOCOPY(MemoryManager);
dcdd144598 2011-02-23        kinaba: };
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //-------------------------------------------------------------------------
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //@{ 唯一のメモリ管理オブジェクトを返す //@}
dcdd144598 2011-02-23        kinaba: inline MemoryManager& mem()
dcdd144598 2011-02-23        kinaba: 	{ return *MemoryManager::pUniqueInstance_; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //@{ ゼロ埋め作業 //@}
dcdd144598 2011-02-23        kinaba: inline void mem00( void* ptrv, int siz )
dcdd144598 2011-02-23        kinaba: 	{ BYTE* ptr = (BYTE*)ptrv;
dcdd144598 2011-02-23        kinaba: 	  for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0x00000000;
dcdd144598 2011-02-23        kinaba: 	  for(;siz;--siz,++ptr) *ptr = 0x00; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //@{ FF埋め作業 //@}
dcdd144598 2011-02-23        kinaba: inline void memFF( void* ptrv, int siz )
dcdd144598 2011-02-23        kinaba: 	{ BYTE* ptr = (BYTE*)ptrv;
dcdd144598 2011-02-23        kinaba: 	  for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0xffffffff;
dcdd144598 2011-02-23        kinaba: 	  for(;siz;--siz,++ptr) *ptr = 0xff; }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: //@{
dcdd144598 2011-02-23        kinaba: //	標準基底クラス
dcdd144598 2011-02-23        kinaba: //
dcdd144598 2011-02-23        kinaba: //	JavaのObject や MFCのCObject みたいに使う…わけではなく、
dcdd144598 2011-02-23        kinaba: //	単にここから派生すると自動で operator new/delete が高速版に
dcdd144598 2011-02-23        kinaba: //	なるので便利だよ、という使い方のための基底クラスです。
dcdd144598 2011-02-23        kinaba: //@}
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: class Object
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: #ifdef USE_ORIGINAL_MEMMAN
dcdd144598 2011-02-23        kinaba: public:
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	static void* operator new( size_t siz )
dcdd144598 2011-02-23        kinaba: 		{ return mem().Alloc( siz ); }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	static void operator delete( void* ptr, size_t siz )
dcdd144598 2011-02-23        kinaba: 		{ mem().DeAlloc( ptr, siz ); }
dcdd144598 2011-02-23        kinaba: #endif
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: protected:
dcdd144598 2011-02-23        kinaba: 	virtual ~Object()
dcdd144598 2011-02-23        kinaba: 		{}
dcdd144598 2011-02-23        kinaba: };
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: }      // namespace ki
dcdd144598 2011-02-23        kinaba: #endif // _KILIB_MEMORY_H_