发个简单(易用)的内存池

本帖最后由 duanjigang 于 2010-06-01 10:45 编辑

 cme_mem_20100601.tar.gz (5.92 KB, 下载次数: 237)  cme_mem_20100201.tar.gz (2 KB, 下载次数: 300) 
修改历史:
2010-02-01:
首先是把节点中的list和ptr改成 head 和tail了,为了方便理解,老炮给的意见
另外是,在节点中添加了一个raw_data指针,跟data在初始化时同时指向数据内存地址,这样做的目的是防止
用户在退出时忘记了free每一个node,如果采用以前的方式,整个内存池也就忘记Free了,虽然能够在退出时提示开发者,
修改后,能够在提示开发者的基础上释放未被释放的节点。
2010-06-01;
修改内容:其一,初始化N个节点时,为了保留栈的地址,须预留一个节点,因此最多只能申请到N-1个,做了修改,我们在实际开辟时申请N+1个,这样对用户就透明了。其二:new_mem_node时。需要把当前栈顶的节点的data置空,当时写错了,搞成了栈底节点的data置空,虽然不影响功能,但逻辑错误,做了修改。



######################################################################
简单技术含量不高还敢说,易用就看各位的反响了 ,期待更好的改进建议。
自己根据实际工作需要写的,主要是为了省事,稍微提高点效率,省下了N多数组的声明和调用。
把多个类型的内存节点集合到一起统一管理,初始化时统一初始化,调用如下:
  1. init_mem_list (TYPE_S1, sizeof(s1_t), 100);
  2. init_mem_list (TYPE_S2, sizeof(s2_t), 200);
复制代码
退出时统一释放,调用如下:
  1. clean_mem_list();
复制代码
运行过程中调用
调用封装的new和free函数
  1. extern u_int8_t * new_mem_node(u_int8_t type);
  2. extern void free_mem_node( u_int8_t * addr);
复制代码
个人感觉还是比较方便的,效率相对还比较高,首先根据类型哈希到对应的链表上,然后每个链表就是一个栈,弹栈或者压栈就是new和Free操作。

一个简单的使用例子如下:
//cme_hook.c

#include <</font>linux/module.h>
#include <</font>linux/kernel.h>
#include "head.h"
#include "mem_pool.c"

typedef struct
{
    u_int16_t key1;
    u_int32_t key2;
}s1_t;
typedef struct
{
    u_int8_t key1;
    u_int16_t key2;
}s2_t;
const u_int8_t TYPE_S1 = 1;
const u_int8_t TYPE_S2 = 2;


s1_t* s1_list[20];
s2_t* s2_list[50];

int init(void)
{
    int = 0;
    init_mem_list (TYPE_S1, sizeof(s1_t), 100);
    init_mem_list (TYPE_S2, sizeof(s2_t), 200);
    
    for (= 0; <</font> 20; i++)
    {
        s1_list[i] = (s1_t*)new_mem_node(TYPE_S1);
        s1_list[i]->key1 = 2*i;
        s1_list[i]->key2 = 2*i+1;
    }
    
    for (= 0; <</font> 50; i++)
    {
        s2_list[i] = (s2_t*)new_mem_node(TYPE_S2);
        s2_list[i]->key1 = 3*i;
        s2_list[i]->key2 = 3*i+1;
    }
    
    for (= 0; <</font> 20; i++)
    {
        printk("s1_list[%d]=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值