打印

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

[复制链接]
1233|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Simon21ic|  楼主 | 2016-1-17 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Simon21ic 于 2016-1-22 15:55 编辑

直接上代码,不多说了

头文件:
// pool
struct vsfpool_t
{
        uint32_t *flags;
        void *buffer;
        uint32_t size;
        uint32_t num;
};

#define VSFPOOL_DEFINE(name, type, num)                        \
        struct vsfpool_##name##_t\
        {\
                struct vsfpool_t pool;\
        uint32_t mskarr[((num) + 31) >> 5];\
        type buffer[(num)];\
        } name

#define VSFPOOL_INIT(p, type, n)                        \
        do {\
                (p)->pool.flags = (p)->mskarr;\
                (p)->pool.buffer = (p)->buffer;\
                (p)->pool.size = sizeof(type);\
                (p)->pool.num = (n);\
                vsfpool_init((struct vsfpool_t *)(p));\
        } while (0)

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

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

void vsfpool_init(struct vsfpool_t *pool);
void* vsfpool_alloc(struct vsfpool_t *pool);
void vsfpool_free(struct vsfpool_t *pool, void *buffer);
C文件
// pool
void vsfpool_init(struct vsfpool_t *pool)
{
        memset(pool->flags, 0, (pool->num + 31) >> 3);
}

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

        if (index >= pool->num)
        {
                return NULL;
        }
        mskarr_set(pool->flags, index);
        return (uint8_t *)pool->buffer + index * pool->size;
}

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->flags, index);
        }
}
应用代码:
有兴趣的可以先想想这个可以怎么用,我之后公布

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



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

VSFPOOL_INIT(&vsfip_buffer_pool, struct vsfip_buffer_t, VSFIP_CFG_IPBUF_NUM);
buffer = VSFPOOL_ALLOC(&vsfip_buffer_pool, struct vsfip_buffer_t);
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里面应该 ...
void mskarr_set(uint32_t *arr, int bit)
{
        arr[bit >> 5] |= (1 << (bit & 0x1F));
}

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

int mskarr_ffz(uint32_t *arr, int arrlen)
{
        int i, tmp;

        for (i = 0; i < arrlen; i++)
        {
                tmp = ffz(arr[i]);
                if (tmp >= 0)
                {
                        return (i << 5) + tmp;
                }
        }
        return -1;
}


看一下mskarr的代码

使用特权

评论回复
5
gucen12| | 2016-1-28 13:46 | 只看该作者
Simon21ic 发表于 2016-1-28 12:29
看一下mskarr的代码

恩恩,那就对输入的buffer进行判断buffer必须大于pool->buffer且小于pool->buffer[num].

使用特权

评论回复
6
zwwoshi| | 2016-4-14 18:08 | 只看该作者
你的编码思想很好,状态机、时间片、封装等。值得学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

266

主题

2597

帖子

104

粉丝