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
图中1、2、3、4标记对应于源代码分析中的标记