code:mfree - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

|source =

  • 用于释放已分配的内/外存块,合并入空闲块管理链表进行管理
  • 共传入三个参数 : mp , size , aa
  • mp : 用于管理空闲块的链表
  • size : 欲释放的块大小
  • aa : 欲释放的块的首地址

2549

2550 /*

2551  * Free the previously allocated space aa

2552  * of size units into the specified map.

2553  * Sort aa into map and combine on

2554  * one or both ends if possible.

2555  */

2556 mfree(mp, size, aa)

2557 struct map *mp;

2558 {

2559     register struct map *bp;

2560     register int t;

2561     register int a;

2562

2563     a = aa;

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

将bp指向第一个首地址大于a的元素,或指向队列末
2565     if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {

2566          (bp-1)->m_size =+ size;

[1] 若释放块可并入bp前一元素,则合并
2567          if (a+size == bp->m_addr) {

2568           (bp-1)->m_size =+ bp->m_size;

2569           while (bp->m_size) {

2570                bp++;

2571                (bp-1)->m_addr = bp->m_addr;

2572                (bp-1)->m_size = bp->m_size;

2573           }

2574          }

[2] 若释放块可并入bp,则合并
2575     } else {

2576           if (a+size == bp->m_addr && bp->m_size) {

[3] 若释放块可并入bp,则合并
2577                bp->m_addr =- size;

2578                bp->m_size =+ size;

2579           } else if(size) do {

2580                t = bp->m_addr;

2581                bp->m_addr = a;

2582                a = t;

2583                t = bp->m_size;

2584                bp->m_size = size;

2585                bp++;

2586           } while (size = t);

[4] 若释放块不可并入链表,则插入链表
2587     }

2588 }

2589 /*----------------------- */

2590

2591

2592

2593

2594

2595

2596

2597

2598

2599

Table of Contents

Extend

举例

图中1、2、3、4标记对应于源代码分析中的标记

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️