释放内存块池 tx_br.c

本文详细介绍了内存释放过程中如何处理线程挂起的情况。当释放内存块时,如果发现有线程因等待内存而挂起,会将内存块分配给挂起线程并恢复其执行。否则,释放的内存块直接插入空闲链表头部。流程包括检查挂起线程列表,更新内存管理数据结构,并在没有挂起线程时快速插入空闲列表。这一过程涉及到中断处理、线程恢复和内存池管理等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UINT  _tx_block_release(

        VOID *block_ptr);

局部变量:

        

如果suspension_list 有线程挂起,把释放的块给挂起线程,并恢复线程。

如果没有挂起线程等待内存释放,那么释放的内存块,直接插入空闲内存块头部,这样操作简单,不需要遍历链表,开销少。修改内存块控制字段,指向下一个块首地址


流程:

1.禁止中断

2.将要释放的内存块的首地址(释放内存首地址(block_ptr)后退sizeof(CHAR_PTR)是释放内存块的控制字段)赋给work_ptr,pool_ptr为该内存块指向的BCB(所在内存块池的控制块)

         

3.将thread_ptr指向suspension list的第一个挂起线程,检查suspension list是否有线程

        (1) 若suspension list有挂起线程,

                1) 将当前线程从suspension list中删除(按照FIFO)

                2) suspended count--

                3) 清除cleanup防止timeout

                4) 禁用抢占

                5) 恢复中断

                6) 将block_ptr(申请到的内存)赋给*tx_additional_suspend_info

                        //之前在allocate函数中挂起线程时,tx_additional_suspend_info保存了应用程序传入的存储内存地址的指针 

                7) 根据需要关闭timeout timer

                8) 设置状态,suspend status用于allocate函数返回值

                9) 恢复线程

        (2) 若suspension list为空

                1) 释放的内存块的内存指向available list头部,available list的头部指向释放的内存

4.恢复中断

5.返回success

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值