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