SYS_MALLOC_IF *syMallocChangeIF( *mallocIF )
SYS_MALLOC_IF *mallocIF
mallocIF 変更するmalloc等の関数のアドレスを設定した構造体のポインタ
変更前のmalloc等の関数のアドレスを設定した構造体のポインタ
メモリを確保する関数 syMalloc(malloc)、syFree(free)などの実体をユーザーの作成した関数に置き換えます。セガライブラリの関数の中でsyMalloc()を使用している関数からの呼び出しも置き換えられますので、すべての syMalloc()、 malloc()、(C++のnew演算子)のときに使用されるメモリの確保の関数を置き換えます。
SYS_MALLOC_IF myMallocIF; /* malloc library to be changed */ SYS_MALLOC_IF *oldMallocIF; /* malloc library before syMallocChangeIF */ myMallocIF.malloc = myMalloc; myMallocIF.free = myFree; myMallocIF.realloc = myRealloc; myMallocIF.calloc = myCalloc; oldMallocIF = syMallocChangeIF(&myMallocIF);
(1)SYS_MALLOC_IF構造体この関数に渡す引数の構造体は、そのインターフェース(置き換えた関数)を使用する間は常に存在し、有効である必要があります。通常はグローバル変数かスタティック変数として定義してください。
(2)アライメント
syMalloc()などの関数の返すアドレスは、32 バイト 境界にアライメントされていることが保証されている必要があるため、syMallocChangeIF()関数で置き換える関数もそれを満たして下さい。 (ただし、セガライブラリ関数が実行されるときにだけ再度 syMallocChagneIF()関数を呼び出して syMalloc()関数を使用してもとに戻す場合には、その必要はありません。)
(3)ヘッダ領域
日立 SHC++ を使用するときには、SHC++ がメモリブロックヘッダ内に予約領域を必要とするため、次のような制限があります。 具体的には、malloc()関数が返すアドレスを Uint32 *ptr とした場合に ptr-1, と ptr-2 の領域をSHC++ が予約しているために、ユーザの malloc ライブラリはこの領域を空けておく必要があります。 つまり、確保したメモリ領域の前方 8 バイトを空けておく必要があります。
(4)malloc と free の関係
現在の syMallocChangeIF は、free を行うときには、malloc が行われたときと同じ malloc ライブラリが設定されている必要があります。
syCalloc() メモリの確保 syFree() メモリ領域の開放 syMalloc() メモリの確保 syRealloc() 確保したメモリのサイズ変更