UINT _tx_block_allocate(
//指向内存池指针
TX_BLOCK_POOL *pool_ptr,
//指向指针的指针,用于存储申请的内存起始地址
VOID **block_ptr,
//等待选项
ULONG wait_option);
如果有空闲内存,直接返回tx_block_pool_available_list指向的内存块;
如果内存不够,可以挂起到suspension_list,其他线程内存释放后,恢复挂起的线程。
局部变量:
流程:
1.禁止中断 //为了从内存池获取块
2.若有可用内存块
(1) 可用内存块个数--
(2) work_ptr指向available list最前面的块
(3) 设置入参,址传递,需要跨过控制字段sizeof(CHAR_PTR)
//block_ptr是一个两级指针,将*block_ptr指向的地址设为work_ptr+sizeof(CHAR_PTR)
(4) *((CHAR_PTR *)work_ptr)中存储的是下一空闲块,下一空闲块变为头部]
(5) 把刚刚分配的块的控制字段指向内存池控制块
(6) 返回TX_SUCCESS
3.若没有可用的内存空间
(1) 若wait_option不为0,挂起线程到suspension list
1) thread_ptr指向当前线程
2) cleanup
3) 存储挂起时的内存池指针
4) 保存用于存储的内存地址的指针,等到有其他线程释放内存时,恢复本线程重新申请内存时使用
5) 插入suspension list
6) suspended count++
7) 将线程状态设为TX_BLOCK_MEMORY,并设定suspending flag
8) 停止抢占
9) 保存timeout
10) 恢复中断
11) 如果wait option有值,开启定时器,定时器超时清除相关结构,恢复线程
(2) wait_option为0,返回TX_NO_MEMORY
4.返回状态