/*	
 *	clipmemp.h
 *
 *	可変長割り当て・一括開放式のメモリプール
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Sun Oct 16 21:10:38 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	- 既存のclipcoll.cのpool_alloc()で作成するメモリプールも有りますが、異なる特性のメモリプールが必要になったので当モジュールを作成しました。
 *	  clipcoll.cのメモリプールと、当モジュール(clipmemc.c)のメモリプールとの、主な違いは以下の通りです。
 *	  ・clipcoll.cのメモリプールは固定サイズのメモリブロックを割り当てるのに対し、当モジュールのメモリプールは任意のサイズのメモリブロックを割り当てます。
 *	  ・clipcoll.cのメモリプールはメモリブロックを個別に割り当て・解放可能ですが、当モジュールのメモリプールは一括開放だけが可能です。
 *	  ・clipcoll.cのメモリプールは全てのメモリブロックが解放された時に実際にメモリをヒープに返しますが、当モジュールのメモリプールはメモリプールが削除されるまでメモリをヒープに返却しません(一括開放型なので当然です。そうでないとメモリプールの意味が有りません)。
 *	  ・clipcoll.cのメモリプールは参照カウント,確保時コールバック,解放時コールバックの追加機能が有りますが、当モジュールにはそれらの追加機能は有りません。
 */
#ifndef __CLIP_MEMP_H__
#define __CLIP_MEMP_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	構造体
 ****************************************************************************/
//管理構造体
typedef struct _ST_MemPool {
	int		chunkWords;		//チャンクの基本ワード数	これより大きなメモリブロックが要求された場合は、これより大きなチャンクも作成され得る。
	GSList*		chunkList;		//チャンクのリスト		リストのデータの型は(ST_MemPoolChunk*)です。空ならば(ST_MemPool.chunkList==NULL)です。
} ST_MemPool;
/****************************************************************************
 *	グローバル関数
 ****************************************************************************/
ST_MemPool* MemPool_New(int chunkBytes);
void MemPool_Free(ST_MemPool* pMemPool);
void* MemPool_Alloc(ST_MemPool* pMemPool, int allocBytes);
void MemPool_Clear(ST_MemPool* pMemPool);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_MEMP_H__
