UINT _tx_byte_release(
VOID *memory_ptr);
局部变量:
流程:
1.禁止中断
2.work_ptr记录要释放的内存起始地址
3.若work_ptr为有效值
(1) 后退sizeof(CHAR_PTR) + sizeof(ULONG)字节是所在块的控制字段首地址
(2) 检查控制字段(第4-8字节),若不为TX_BYTE_BLOCK_FREE(说明不是空闲内存)
1) 第4-8字节存储了内存池控制块指针
2) 检查内存池控制块指针,内存池是否有效(ID)。若无效返回TX_PTR_ERROR
(3) 若为空闲内存,返回TX_PTR_ERROR
4.若work_ptr无效,返回TX_PTR_ERROR
5.thread_ptr记录当前线程
6.设置当前线程为内存池拥有者
7.禁止中断
8.释放内存,标记为TX_BLOCK_FREE,成为空闲块
9.更新可用内存大小
*((CHAR_PTR *)(work_ptr))为相邻的下一块内存首地址,(*((CHAR_PTR *)(work_ptr)) - work_ptr)就是本块内存的大小
10.循环。检查suspension list是否有线程挂起,如果有,尝试为这些线程申请内存并恢复线程 //当suspension list为空时退出
(1) susp_thread_ptr记录第一个挂起线程
(2) 恢复中断
(3) 搜索是否有合适内存,结果返回到work_ptr。susp_thread_ptr -> tx_suspend_info为之前tx_byte_allocate中线程挂起时保存的申请内存大小。
(4) 禁止中断
(5) 若申请失败,直接跳出,不再申请
(6) 再次检查susp_thread_ptr线程是否还在suspension list中,因为前面开中断,挂起线程可能恢复、中止等。若不在
1) 把刚刚申请的内存释放
2) 继续处理下一个线程
(7) 申请成功,线程还在suspension list中,把这个线程从suspension list中移除
(8) suspended_count--
(9) 清除cleanup
(10) 禁止抢占
(11) 恢复中断
(12) tx_additional_suspend_info保存返回的内存地址
(13) timer
(14) 将suspend status设为SUCCESS //线程恢复后,从tx_byte_allocate函数返回时的返回值
(15) preempt记录_tx_thread_resume返回true统计
(16) 禁止中断
11.恢复中断
12.检查是否需要进行抢占
13.返回SUCCESS