C实现固定大小对象池
来源:互联网 发布:wildcard ssl nginx 编辑:程序博客网 时间:2024/05/16 09:09
typedef struct common_obj_pool common_obj_pool;typedef struct common_obj_node common_obj_node;struct common_obj_pool { uint count; //total num uint size; //per size uint free; //unused num int head; //insert pos int tail; //delete pos uint len; //buffer len void *ptr; //buffer addr};struct common_obj_node { int status; //0:unuse, 1:inuse int next; //>=0:next, -1:tail, -2:inuse void *data; //user data};#define COM_OBJ_NODE_HEADL (sizeof(common_obj_node)-sizeof(void*))#define COM_OBJ_NODE_SIZE (COM_OBJ_NODE_HEADL + (pool->size))int common_obj_pool_init(common_obj_pool *pool, uint count, uint size){ int i; common_obj_node *obj; if(pool == NULL || count < 2 || size < 0) return EINVAL; pool->count = count; pool->free = count; pool->size = size; pool->head = 0; pool->tail = count-1; pool->len = count*COM_OBJ_NODE_SIZE; pool->ptr = malloc(pool->len); if(pool->ptr == NULL) return errno; obj = pool->ptr; for(i=0; i<count; i++){ obj->status = 0;if(i == count-1)obj->next = -1;elseobj->next = i+1; obj = (void*)obj + COM_OBJ_NODE_SIZE; } return 0;}int common_obj_pool_destroy(common_obj_pool *pool){ free(pool->ptr); memset(pool, 0, sizeof(common_obj_pool)); return 0;}int common_obj_malloc(common_obj_pool *pool, void **ptr){ common_obj_node *obj; if(pool == NULL) return EINVAL; if(pool->free <= 0) return ENOMEM; obj = pool->ptr + (pool->head)*COM_OBJ_NODE_SIZE; if(obj->status != 0) return EFAULT; pool->head = obj->next; pool->free--; obj->status = 1; obj->next = -2; *ptr = &obj->data; memset(*ptr, 0, pool->size); return 0;}int common_obj_free(common_obj_pool *pool, void *ptr){ int index; common_obj_node *obj, *tail; if(pool == NULL || ptr == NULL) return EINVAL; obj = ptr - COM_OBJ_NODE_HEADL; if(obj->status != 1) return EFAULT; index = ((void*)obj - pool->ptr) / COM_OBJ_NODE_SIZE; <pre code_snippet_id="605188" snippet_file_name="blog_20150215_1_5241167" name="code" class="cpp"> if(pool->head < 0) pool->head = indexelse{tail = pool->ptr + (pool->tail)*COM_OBJ_NODE_SIZE; tail->next = index;} pool->tail = index; pool->free++; obj->status = 0; obj->next = -1; return 0;}
0 0
- C实现固定大小对象池
- 单线程固定大小对象的内存池实现
- 单线程不固定大小对象的内存池实现
- C语言-固定大小内存池
- C#Winform固定大小
- 固定大小内存池设计与实现
- C语言固定大小的线性表的简单实现
- 单线程环境中对象大小固定的内存池
- 对象大小固定的单线程内存池设计
- c#WinForm固定窗口大小
- 袖珍版固定大小 内存池1(c语言)
- 简单实现一个固定大小的内存池
- 固定块内存池c语言实现
- 实现一个大小固定的矩阵
- QT 实现固定大小圆形进度条
- (2)单线程内存池--固定大小对象的内存池
- 一种固定内存池的实现(C++)
- 内存池——实现一个简单的固定大小的内存池
- 接口配置锦囊妙计之三----端口自协商
- 自闭症的临床表现
- Android--sharepreference总结
- Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
- Objective-C 的一些优点
- C实现固定大小对象池
- 用JS控制当浏览器滚动条到最底部(也就是用户浏览到了网站的底部)时,自动隐藏某个DIV。
- git常用命令(一些小技巧)
- WINDOWS远程桌面,由于这台计算机没有终端服务器客户端访问许可证
- UISearchBar 改变编辑去背景颜色
- linux shell脚本速记
- Wince the global default build tree winceroot 问题
- Java标记接口
- Java Map集合利用比较器Comparator根据Key和Value的排序