分配内存块池 tx_ba.c

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.返回状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值