POOL
#ifndef POOL_HHH
#define POOL_HHH #include "common.h" /* simple and fast obj pool without multi-thread support */ typedef uint32_t pool_size_t;
typedef uint32_t pool_obj_size_t; typedef struct pool { pool_obj_size_t objsize;
pool_obj_size_t objmemsize; pool_size_t num; pool_size_t free_idx; /* free list implemented by array */
pool_size_t *freeobj; /* free list array */ void *obj; /* obj array */
char buffer[];
} pool_t; typedef struct pool_obj_head {
pool_t *p; } pool_obj_head_t; pool_t *pool_create(pool_obj_size_t objsize, pool_size_t poolsize); void *pool_alloc_obj(pool_t * p); void pool_free_obj(pool_t * p, void *obj); void pool_destory(pool_t * p); #endif
#include "common.h"
#include "pool.h"
#include <assert.h> static inline void *objmem_to_obj(void *objmem)
{
return objmem + sizeof(pool_obj_head_t);
} static inline void *obj_to_objmem(void *obj)
{
return obj - sizeof(pool_obj_head_t);
} static inline void *idx_to_objmem(pool_t * p, pool_size_t idx)
{
return p->obj + idx * (p->objmemsize);
} static inline pool_size_t objmem_to_idx(pool_t * p, void *obj)
{
return (obj - p->obj) / (p->objmemsize);
} pool_t *pool_create(pool_obj_size_t objsize, pool_size_t poolsize)
{ pool_size_t i;
pool_obj_head_t *head; pool_t *p; size_t manage_mem_size = (sizeof(pool_t));
size_t free_list_mem_size = (poolsize * sizeof(pool_size_t));
size_t obj_mem_size = (objsize + sizeof(pool_obj_head_t)) * poolsize; p = calloc(manage_mem_size + free_list_mem_size + obj_mem_size, ); if (!p)
return NULL; p->num = poolsize;
p->objsize = objsize;
p->objmemsize = obj_mem_size / poolsize;
p->freeobj = (void *)p->buffer;
p->obj = p->buffer + free_list_mem_size; /* init free list */
p->free_idx = ;
for (i = ; i < p->num; i++) {
p->freeobj[i] = i + ;
} /* init obj head */
for (i = ; i < p->num; i++) {
head = (pool_obj_head_t *) (idx_to_objmem(p, i));
head->p = p;
}
return p;
} void *pool_alloc_obj(pool_t * p)
{
pool_size_t idx;
void *obj; if (unlikely(p->free_idx == p->num)) {
return NULL; /* empty */
} idx = p->free_idx;
p->free_idx = p->freeobj[idx]; obj = idx_to_objmem(p, idx); return objmem_to_obj(obj);
} void pool_free_obj(pool_t * p, void *obj)
{ pool_size_t idx;
pool_obj_head_t *head; head = (pool_obj_head_t *) obj_to_objmem(obj); assert(head->p == p); idx = objmem_to_idx(p, obj); /* insert to list head, hot cache */
p->freeobj[idx] = p->free_idx;
p->free_idx = idx;
} void pool_destory(pool_t * p)
{
free(p);
}
POOL的更多相关文章
- 添加 Pool Member - 每天5分钟玩转 OpenStack(123)
我们已经有了 Load Balance Pool "web servers"和 VIP,接下来需要往 Pool 里添加 member 并学习如何使用 cloud image. 先准 ...
- 创建 Pool & VIP - 每天5分钟玩转 OpenStack(122)
上节完成了 LBaaS 配置,今天我们开始实现如下 LBaaS 环境. 环境描述如下: 1. 创建一个 Pool “web servers”. 2. 两个 pool member “WEB1” 和 “ ...
- [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)
原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...
- Ceph RGW 创建默认的pool
使用Ceph-deploy完成RGW服务部署后(最好是在部署RGW服务前建立如下这些pool),使用sudo ceph osd lspools 命令,会发现RGW自动以默认参数创建了N个rgw相关的p ...
- golang 裸写一个pool池控制协程的大小
这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...
- 如何在Windows 2003+IIS6的环境下找回应用程序池(application pool)中的服务账号密码
上一篇文章说了说如何在Win2008+iis7中取出SharePoint管理账号密码的方法. 整个过程简单的讲,就是通过使用要找回密码的账号用来在SharePoint中创建一个临时的Web Appli ...
- 备忘-Sql server Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
select * from sysprocesses where dbid= db_id('数据库名') 通过此语句可查看目前所有的连接进程 不够了就必须设置Max Pool Size,理论最大值为3 ...
- SQL Server 2014新特性探秘(2)-SSD Buffer Pool Extension
简介 SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随 ...
- python进程池:multiprocessing.pool
本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...
- XenServer pool 移除server 设置master
如果因为Pool中Master主机由于某种原因导致失效,会引起整个Pool进入紧急模式,恢复步骤如下: 在成员服务器上输入如下命令 # xe host-emergency-ha-disable ...
随机推荐
- hdu 3586 Information Disturbing(树形dp + 二分)
本文出自 http://blog.csdn.net/shuangde800 题目链接: hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...
- NDK-r7以上版本部署方法
一.关于NDK: NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和jav ...
- xhEditor与Java结合使用
xhEditor是一个轻量级的html编辑器,使用它可以非常方便的编辑图文内容,然而官方文档中只有php的演示,没有Java版的,最近两天参考网上各种各样的文档,琢磨了一下用法,现已可以正常运行,现在 ...
- 测试cnblogs是否存在链接引用的bug
如果来源页弹出了一个对话框,或者跳转到了本页面,说明来源页面存在链接引用的bug
- android线程与线程池-----线程池(二)《android开发艺术与探索》
android 中的线程池 线程池的优点: 1 重用线程池中的线程,避免了线程的创建和销毁带来的性能开销 2 能有效的控制最大并发数,避免大量线程之间因为喜欢抢资源而导致阻塞 3 能够对线程进行简单的 ...
- artTemplate模板引擎的源码拜读
最初接触的模板引擎还是基于node的ejs,当时觉得很神奇原来还可以这么玩,后来随着学习的深入,使用过jade,doT等,当然还有一些比较火的诸如juicer.underscore还没有深入接触,直到 ...
- window 安装 Protobuf
环境安装 1:下载CMake 2:打开VS Command Prompt 3:修改工作目录到目标目录 cd C:\Path\to 4:创建编译完后 protobuf headers/libraries ...
- .NET 操作PDF文档以及PDF文件打印摸索总结
关于生成 PDF 的操作,相信大家的在实际的工作过程中难免会碰到.以前我们通过生成 word 文档来进行文件的打印,但是由于太过依赖 office 软件,因此尝试能不能使用 PDF 进行文件打印. 在 ...
- 如何在Sql2008中获取表字段属性和注释?
如何在Sql2008中获取表字段属性和注释? select b.[value] from sys.columns a left join sys.extended_properties b on a. ...
- strace跟踪操作的详细内容