UNIX 6th code reading - mfree

初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014

はじめに

今回は、割り当てられていたメモリ領域を開放するmfreeです。

ロジック

イメージはこんな感じ。

2564行で、開放するアドレスの、1つ後ろの空き領域までポインタを進めます。上図の上部にあたります。
空き領域はアドレス順で並んでいるので、この書き方でOKなわけです。(でも自分ならwhileを使うかな……)

2564 : for( bp = mp; bp->m_addr <= a && bp->m_size != 0; bp ++ ) ;

続いて、2565-2587行で開放する領域がmap配列に追加されます。上図の下部にあたります。
隣り合った空き領域が連続している場合、必ずマージされないといけないというルールがあるので、前方・後方の空き領域との関係から処理が分岐しています。

  • 2565 - 2574 : 開放する領域の先端が、1つ前の空き領域と接している場合。1つ前の空き領域にマージされる(2566)。
    • 2567 - 2574 : さらに、開放する領域の後端が、1つ後ろの空き領域と接している場合。1つ後ろの空き領域ともマージされる。それ以降の空き領域は、1つずつ前方にシフトされる(2569-2573)。
  • 2575 - 2587 : 開放する領域の先端が、1つ前の空き領域と接していない場合。
    • 2576 - 2578 : 開放する領域の後端が、1つ後ろの空き領域と接している場合。1つ後ろの空き領域とマージされる。
    • 2579 - 2586 : 開放する領域の後端が、1つ後ろの空き領域と接していない場合。開放する領域を配列に追加し、それ以降の空き領域は1つずつ後方へシフトされる。

終わりに

次はprf.cの予定。次のイベントまでには、7章まで終わらせたいのだけれども、間に合うかな。