XINU
|
メモリブロックを解放し、ブロックを空きリストに戻す。 More...
#include <xinu.h>
Go to the source code of this file.
Functions | |
syscall | freemem (char *blkaddr, uint32 nbytes) |
メモリブロックを解放し、ブロックを空きリストに戻す。 More... | |
メモリブロックを解放し、ブロックを空きリストに戻す。
Definition in file freemem.c.
メモリブロックを解放し、ブロックを空きリストに戻す。
Step1. 割り込みを禁止する。
Step2. 以下のいずれかの場合は、割り込み状態を復元し、処理を終了する。
・メモリブロックのサイズが0の場合
・メモリブロックのポインタがヒープ開始アドレスより小さい場合
・メモリブロックのポインタがヒープ終了アドレスより大きい場合
Step4. メモリブロックのサイズを8の倍数で丸める。
Step5. フリーメモリリストから空きメモリブロックの位置を探す。
Step6. 「一つ前のメモリブロック」と「解放対象メモリブロック」の結合を試みるため、
一つ前のメモリブロックの最終アドレスを算出する(このアドレスはTOPとして扱う)。
Step7. 解放対象メモリブロックが前後のメモリブロックと重なっていた場合は、
割り込み状態を復元し、処理を終了する。
Step8. フリーメモリリストの使用可能メモリサイズに対して、今回解放するメモリブロックのサイズを加算する。
Step9. 解放対象のメモリブロックを一つ前のメモリブロックと結合するか、フリーメモリリストに追加する。
Step10. 解放対象のメモリブロックが次のメモリブロックと隣接している場合は、結合する。
Step11. 割り込み状態を復元する。
[in] | blkaddr | メモリブロックのポインタ |
[in] | nbytes | メモリブロックのサイズ(Byte) |
Definition at line 33 of file freemem.c.
References disable(), maxheap, memlist, minheap, memblk::mlength, memblk::mnext, NULL, OK, restore(), roundmb, and SYSERR.
Referenced by mkbufpool().