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系関数の入れ替え