又一个OOC的示例---内存池

[复制链接]
1481|5
 楼主| Simon21ic 发表于 2016-1-17 14:44 | 显示全部楼层 |阅读模式
本帖最后由 Simon21ic 于 2016-1-22 15:55 编辑

直接上代码,不多说了

头文件:
  1. // pool
  2. struct vsfpool_t
  3. {
  4.         uint32_t *flags;
  5.         void *buffer;
  6.         uint32_t size;
  7.         uint32_t num;
  8. };

  9. #define VSFPOOL_DEFINE(name, type, num)                        \
  10.         struct vsfpool_##name##_t\
  11.         {\
  12.                 struct vsfpool_t pool;\
  13.         uint32_t mskarr[((num) + 31) >> 5];\
  14.         type buffer[(num)];\
  15.         } name

  16. #define VSFPOOL_INIT(p, type, n)                        \
  17.         do {\
  18.                 (p)->pool.flags = (p)->mskarr;\
  19.                 (p)->pool.buffer = (p)->buffer;\
  20.                 (p)->pool.size = sizeof(type);\
  21.                 (p)->pool.num = (n);\
  22.                 vsfpool_init((struct vsfpool_t *)(p));\
  23.         } while (0)

  24. #define VSFPOOL_ALLOC(p, type)                                \
  25.     (type *)vsfpool_alloc((struct vsfpool_t *)(p))

  26. #define VSFPOOL_FREE(p, buf)                                        \
  27.         vsfpool_free((struct vsfpool_t *)(p), (buf))

  28. void vsfpool_init(struct vsfpool_t *pool);
  29. void* vsfpool_alloc(struct vsfpool_t *pool);
  30. void vsfpool_free(struct vsfpool_t *pool, void *buffer);
C文件
  1. // pool
  2. void vsfpool_init(struct vsfpool_t *pool)
  3. {
  4.         memset(pool->flags, 0, (pool->num + 31) >> 3);
  5. }

  6. void* vsfpool_alloc(struct vsfpool_t *pool)
  7. {
  8.         int index = mskarr_ffz(pool->flags, (pool->num + 31) >> 5);

  9.         if (index >= pool->num)
  10.         {
  11.                 return NULL;
  12.         }
  13.         mskarr_set(pool->flags, index);
  14.         return (uint8_t *)pool->buffer + index * pool->size;
  15. }

  16. void vsfpool_free(struct vsfpool_t *pool, void *buffer)
  17. {
  18.         int index = ((uint8_t *)buffer - (uint8_t *)pool->buffer) / pool->size;

  19.         if (index < pool->num)
  20.         {
  21.                 mskarr_clr(pool->flags, index);
  22.         }
  23. }
应用代码:
有兴趣的可以先想想这个可以怎么用,我之后公布

忘了说了,这个代码有BUG的,看谁能找粗来



公布示例代码了,分别是声明,初始化,分配,释放:
  1. VSFPOOL_DEFINE(vsfip_buffer_pool, struct vsfip_buffer_t, VSFIP_CFG_IPBUF_NUM);

  2. VSFPOOL_INIT(&vsfip_buffer_pool, struct vsfip_buffer_t, VSFIP_CFG_IPBUF_NUM);
  3. buffer = VSFPOOL_ALLOC(&vsfip_buffer_pool, struct vsfip_buffer_t);
  4. VSFPOOL_FREE(&vsfip_buffer_pool, buffer);
BUG的话,在vsfpool_free里。


keer_zu 发表于 2016-1-21 12:56 | 显示全部楼层
gucen12 发表于 2016-1-28 11:31 | 显示全部楼层
内存池的首地址和内存池中vsfip_buffer_pool结构体数组的首地址不一样吧,所以我绝对vsfpool_free里面应该这样写
void vsfpool_free(struct vsfpool_t *pool, void *buffer)
{

        int index = ((uint8_t *)buffer - (uint8_t *)pool->buffer) / pool->size;、
        if (index < pool->num)
        {
                mskarr_clr(pool->buffer,index);
        }
}
 楼主| Simon21ic 发表于 2016-1-28 12:29 | 显示全部楼层
gucen12 发表于 2016-1-28 11:31
内存池的首地址和内存池中vsfip_buffer_pool结构体数组的首地址不一样吧,所以我绝对vsfpool_free里面应该 ...
  1. void mskarr_set(uint32_t *arr, int bit)
  2. {
  3.         arr[bit >> 5] |= (1 << (bit & 0x1F));
  4. }

  5. void mskarr_clr(uint32_t *arr, int bit)
  6. {
  7.         arr[bit >> 5] &= ~(1 << (bit & 0x1F));
  8. }

  9. int mskarr_ffz(uint32_t *arr, int arrlen)
  10. {
  11.         int i, tmp;

  12.         for (i = 0; i < arrlen; i++)
  13.         {
  14.                 tmp = ffz(arr[i]);
  15.                 if (tmp >= 0)
  16.                 {
  17.                         return (i << 5) + tmp;
  18.                 }
  19.         }
  20.         return -1;
  21. }


看一下mskarr的代码
gucen12 发表于 2016-1-28 13:46 | 显示全部楼层
Simon21ic 发表于 2016-1-28 12:29
看一下mskarr的代码

恩恩,那就对输入的buffer进行判断buffer必须大于pool->buffer且小于pool->buffer[num].
zwwoshi 发表于 2016-4-14 18:08 | 显示全部楼层
你的编码思想很好,状态机、时间片、封装等。值得学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:www.versaloon.com --- under construction

266

主题

2597

帖子

104

粉丝
快速回复 在线客服 返回列表 返回顶部