Shinobi Library - メモリマネージメント関数

syMallocMultiChangeIF

サブヒープに対するインタフェースの置換え

書式

SYS_MALCM_IF *syMallocMultiChangeIF( heaph, mallocIF )
SYS_MALCM_HEAPH *heaph
SYS_MALCM_IF *mallocIF

引数

heaph   (出力)ヒープハンドル
mallocIF   新しいインタフェース

戻り値

入れ替える前のインタフェースへのポインタ

解説

この関数は、引数heaph で示されるサブヒープ領域の malloc()関連関数をユーザ定義のものに置き換えます。

この関数の実行によって、他のサブヒープに対するインタフェースは影響を受けません。

登録するインタフェースは、引数mallocIF によって渡しますが、引数mallocIF の指す実体は、インタフェースの各関数にディスパッチするときに内部で直接使用されるため、当該のインタフェースを使う間は消滅しないようにする必要があります。

引数mallocIF の示すインタフェースの各関数を実装する際には、第一引数で渡される heaph が指す内容を利用して、どのサブヒープから領域を確保するかを判断する必要があります。 この際に heaph->Start, heaph->Size がサブヒープの領域を示すので、登録されるインタフェースの各関数はそれらを判断するか、heaph のアドレスによってどのサブヒープから領域を確保するかを判断する必要があります。


用例

Sint8 myHeap[1024];
SYS_MALCM_HEAPH myHeaph;
STRUCT_FOO *foo;
Uint32 wholeSize, bigSize;
extern const SYS_MALCM_IF myMallocIF;

syMallocMultiCreateHeap(&myHeaph, myHeap, 1024);
syMallocChangeIF(&myHeaph, &myMallocIF);
if((foo = syCallocMulti(&myHeaph, sizeof(STRUCT_FOO), 3)) == NULL){
	/* Could not allocate the memory */
	myError();
} else {
	/* Allocation OK */
	syMallocMultiStat(heaph, &whileSize, &bigSize);
	DoWhatYouWant(foo);
	syFreeMulti(&myHeaph, p);
}
syMallocMultiDelete(&heaph);

備考

インタフェースを変更した領域の範囲内でのメモリ管理はユーザ責任によって行う必要があります。 この時にそれぞれの引数 heaph に応じた管理情報を持つ必要がありますが、SYS_MALCM_HEAPH 構造体の Root、 Freep メンバーの領域は、当該のサブヒープに対してデフォルトの syMallocMulti() インタフェースの関数群を使用しない場合には独自に使用しても構いません。

参照

syMallocMultiCreate()
 サブヒープの登録
syMallocMultiDelete()
 サブヒープの登録解除
syMallocMulti()
 syMallocMulti サブヒープからのメモリ取得
syReallocMulti()
 サブヒープ上での realloc 操作
syFreeMulti()
 サブヒープから取得したメモリ領域の開放
syCallocMulti()
 サブヒープ領域への calloc 操作
syMallocMultiStat()
 サブヒープ領域の使用状況調査
syMallocChangeIF()
 malloc系関数の入れ替え

syMallocMultiChangeIF
COPYRIGHT © SEGA ENTERPRISES, LTD., 1998-2000