Artifact Content

Not logged in

Artifact 191649d03470b28c89e0123672de19ad278f0cdd


#ifndef _KILIB_MEMORY_H_
#define _KILIB_MEMORY_H_
#include "types.h"
#include "thread.h"
#ifndef __ccdoc__
namespace ki {
#endif


// W�łł�HeapAlloc�𒼐ڌĂяo���o�[�W�������g��
//#if !defined(_UNICODE) && defined(SUPERTINY)
//	#define USE_ORIGINAL_MEMMAN
//#endif

// ���K�͂ƌ��Ȃ��I�u�W�F�N�g�̍ő�T�C�Y
#define SMALL_MAX 64
// ��x�Ɋm�ۂ���q�[�v�u���b�N�̃T�C�Y
#define BLOCK_SIZ 4096
// ��������
struct MemBlock;



//=========================================================================
//@{ @pkg ki.Memory //@}
//@{
//	���������蓖�āE����@�\
//
//	SUPERTINY�I�v�V������t���ăR���p�C������ƁA�W����
//	malloc��free���g���Ȃ��Ȃ邽�߁AHeapAlloc����API��
//	���ڌĂяo���K�v���o�Ă��܂��B�������A�����‚��{����
//	���񒼂ɌĂ�ł���ƁA�x���B�����A�z���ƁA�o�J���ƁA
//	���Đ����Œx���B�����ŁA���new�œ��I�ɏ��K�̓�������
//	�m�ۂ��邱�ƂɎ��𐘂����ȒP�ȃA���P�[�^���g�����Ƃɂ��܂����B
//
//	<a href="http://cseng.aw.com/book/0,3828,0201704315,00.html">loki</a>
//	���C�u�����قڂ��̂܂�܂Ȏ����ł��B
//@}
//=========================================================================

class MemoryManager : public EzLockable
{
public:

	//@{ ���������蓖�� //@}
	void* Alloc( size_t siz );

	//@{ ��������� //@}
	void DeAlloc( void* ptr, size_t siz );

#ifdef USE_ORIGINAL_MEMMAN
private:
	struct FixedSizeMemBlockPool
	{
		void Construct( byte siz );
		void Destruct();
		void*  Alloc();
		void DeAlloc( void* ptr );
		bool isValid();
	private:
		MemBlock* blocks_;
		int       blockNum_;
		int       blockNumReserved_;
		byte      fixedSize_;
		byte      numPerBlock_;
		int       lastA_;
		int       lastDA_;
	};
	FixedSizeMemBlockPool pools_[ SMALL_MAX ];
#endif

private:

	MemoryManager();
	~MemoryManager();

private:

	static MemoryManager* pUniqueInstance_;

private:

	friend void APIENTRY Startup();
	friend inline MemoryManager& mem();
	NOCOPY(MemoryManager);
};



//-------------------------------------------------------------------------

//@{ �B��̃������Ǘ��I�u�W�F�N�g��Ԃ� //@}
inline MemoryManager& mem()
	{ return *MemoryManager::pUniqueInstance_; }

//@{ �[�����ߍ�� //@}
inline void mem00( void* ptrv, int siz )
	{ BYTE* ptr = (BYTE*)ptrv;
	  for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0x00000000;
	  for(;siz;--siz,++ptr) *ptr = 0x00; }

//@{ FF���ߍ�� //@}
inline void memFF( void* ptrv, int siz )
	{ BYTE* ptr = (BYTE*)ptrv;
	  for(;siz>3;siz-=4,ptr+=4) *(DWORD*)ptr = 0xffffffff;
	  for(;siz;--siz,++ptr) *ptr = 0xff; }



//=========================================================================
//@{
//	�W�����N���X
//
//	Java��Object �� MFC��CObject �݂����Ɏg���c�킯�ł͂Ȃ��A
//	�P�ɂ�������h������Ǝ����� operator new/delete �������ł�
//	�Ȃ�̂ŕ֗�����A�Ƃ����g�����̂��߂̊��N���X�ł��B
//@}
//=========================================================================

class Object
{
#ifdef USE_ORIGINAL_MEMMAN
public:

	static void* operator new( size_t siz )
		{ return mem().Alloc( siz ); }

	static void operator delete( void* ptr, size_t siz )
		{ mem().DeAlloc( ptr, siz ); }
#endif

protected:
	virtual ~Object()
		{}
};



//=========================================================================

}      // namespace ki
#endif // _KILIB_MEMORY_H_