完全オリジナルのメモリ管理ルーチン mm_alloc ライブラリ Copyright 1995 Ogasawara Hiroyuki (COR.) このライブラリは Ko-Window 上からも使用できるヒープ領域の自動拡張型 malloc ライブラリです。Ko-Window 上からの使用の場合、XClib でも libc でもどちらから でも使用できます。ただし必ず他のライブラリより先に1番最初にリンクして下さい。 mm_klib.a Ko-Window 用 mm_alib.a 一般用 1. 互換ルーチン void *malloc( size ) ------------------------------------------------------------------------------- int size; 指定サイズヒープからメモリを確保し、そのポインタを返します。もしヒー プ領域が足りなくてメモリが確保できない場合は、空きメモリがある限り自 分でヒープ領域を拡大します。Ko-Window 上での使用も当然 OK です。それ でもメモリが確保できない場合は NULL を返します。なお、確保するアドレ スは必ず偶数番地(実際は4byte単位)になります。拡張する場合のヒープ領 域の単位は変数 mm_BlockSize に設定することができます。(デフォルトは 64Kbyte 単位) ------------------------------------------------------------------------------- void free( ptr ) ------------------------------------------------------------------------------- void *ptr; malloc() で確保したメモリを開放します。malloc() で得たポインタ以外の アドレスを渡してはいけません。なお、この関数で確保したメモリを全部開 放したとしても、malloc() で拡大されたヒープ領域は小さくはなりません。 ------------------------------------------------------------------------------- void *realloc( ptr, size ) ------------------------------------------------------------------------------- void *ptr; int size; malloc() で確保したメモリのサイズを変更し、新たなアドレスを返します。 サイズ変更できなかった場合は NULL を返します。 ------------------------------------------------------------------------------- void *calloc( count, size ) ------------------------------------------------------------------------------- int count; int size; size サイズで count 個分のメモリを確保し、ゼロクリアしたのちそのアド レスを返します。内部で malloc() を呼び出しています。戻り値や基本的な 動作は malloc() と同じです。 ------------------------------------------------------------------------------- 2. ヒープ確保ルーチン このライブラリで使用するヒープ領域は、C 言語のスタートアップルーチンでは初 期化されません。そのため、あらかじめ以下の3種類の方法のうちどれかで初期化を しなければなりません。 (1) Ko-Window アプリケーションの場合 他のライブラリより先に mm_klib.a をリンクして下さい。それだ けで OK です。初期ヒープサイズは WindowHeapSize で与えます。 MiniTERM(mtmlib) でも当然使えます。 ただし、GlobalInit/GlobalExit を使用しているアプリケーション では使えません。(普通そういうアプリはありません) (2) 初期ヒープとしてシステムヒープを利用する場合。 mm_new_heap_init()/mm_new_heap_quit() を使う (3) 初期ヒープは使わずすべて自分でメモリ管理るする場合 mm_heap_init()/mm_heap_quit() を使う void* mm_heap_init( size ) ------------------------------------------------------------------------------- int size; 専用のヒープ領域を新たに確保します。確保できなければ NULL を返します。 この関数で確保するヒープ領域は、通常のプロセスのヒープ領域とは異なっ ています。システムのヒープ領域が 0 で、新たに確保する必要がある場合 に使用して下さい。このヒープ領域を開放する場合は必ず mm_heap_quit() を使用して下さい。 ------------------------------------------------------------------------------- void* mm_heap_quit() ------------------------------------------------------------------------------- mm_heap_init() で確保したヒープ領域を全部開放します。プログラムの終 了時に呼び出します。 ------------------------------------------------------------------------------- void* mm_new_heap_init( ptr, size ) ------------------------------------------------------------------------------- void *ptr; int size; すでにあるメモリブロックの先頭アドレスとポインタを与えて、それをこの ライブラリようの初期ヒープエリアとして使用します。このヒープ領域を開 放する場合は必ず mm_new_heap_quit() を使用して下さい。 ------------------------------------------------------------------------------- void* mm_new_heap_quit() ------------------------------------------------------------------------------- mm_new_heap_init() で確保したヒープ領域を全部開放します。プログラム の終了時に呼び出します。このルーチンは mm_heap_quit() とは違い、最初 のメモリブロックは開放しません。 ------------------------------------------------------------------------------- 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.