#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的更多相关文章

  1. 添加 Pool Member - 每天5分钟玩转 OpenStack(123)

    我们已经有了 Load Balance Pool "web servers"和 VIP,接下来需要往 Pool 里添加 member 并学习如何使用 cloud image. 先准 ...

  2. 创建 Pool & VIP - 每天5分钟玩转 OpenStack(122)

    上节完成了 LBaaS 配置,今天我们开始实现如下 LBaaS 环境. 环境描述如下: 1. 创建一个 Pool “web servers”. 2. 两个 pool member “WEB1” 和 “ ...

  3. [转载】——故障排除:Shared Pool优化和Library Cache Latch冲突优化 (文档 ID 1523934.1)

    原文链接:https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrlstate=23w4l35u5_4&id=152393 ...

  4. Ceph RGW 创建默认的pool

    使用Ceph-deploy完成RGW服务部署后(最好是在部署RGW服务前建立如下这些pool),使用sudo ceph osd lspools 命令,会发现RGW自动以默认参数创建了N个rgw相关的p ...

  5. golang 裸写一个pool池控制协程的大小

    这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...

  6. 如何在Windows 2003+IIS6的环境下找回应用程序池(application pool)中的服务账号密码

    上一篇文章说了说如何在Win2008+iis7中取出SharePoint管理账号密码的方法. 整个过程简单的讲,就是通过使用要找回密码的账号用来在SharePoint中创建一个临时的Web Appli ...

  7. 备忘-Sql server Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置

    select * from sysprocesses where dbid= db_id('数据库名') 通过此语句可查看目前所有的连接进程 不够了就必须设置Max Pool Size,理论最大值为3 ...

  8. SQL Server 2014新特性探秘(2)-SSD Buffer Pool Extension

    简介     SQL Server 2014中另一个非常好的功能是,可以将SSD虚拟成内存的一部分,来供SQL Server数据页缓冲区使用.通过使用SSD来扩展Buffer-Pool,可以使得大量随 ...

  9. python进程池:multiprocessing.pool

    本文转至http://www.cnblogs.com/kaituorensheng/p/4465768.html,在其基础上进行了一些小小改动. 在利用Python进行系统管理的时候,特别是同时操作多 ...

  10. XenServer pool 移除server 设置master

    如果因为Pool中Master主机由于某种原因导致失效,会引起整个Pool进入紧急模式,恢复步骤如下: 在成员服务器上输入如下命令 # xe host-emergency-ha-disable     ...

随机推荐

  1. 使用Pager-taglib进行分页

    在.net中,我们有分页控件.在java中,我们有分页标签库.他们都已经为我们封装好了,我们只需要给这几个参数:数据.当前页码.每页记录数,就能完成分页,所以他们是大同小异的. 今天来说说Pager- ...

  2. shell 脚本执行日志通用模块

    目标 实现记录SHELL执行的開始时间,结束时间.执行状态,错误信息等,以函数封装日志记录的方式,脚本调用函数 源代码 通用函数脚本program_log_new.sh function init_l ...

  3. 【剑指Offer学习】【面试题14 :调整数组顺序使奇数位于偶数前面】

    题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位予数组的后半部分. 这个题目要求把奇数放在数组的前半部分, 偶数放在数组的后半部分,因此全部的奇 ...

  4. Chapter 6 - How to Play Music and Sound Effect

    In this chapter, we would add background music to the game and play sound effect when the hero fires ...

  5. ASP.NET MVC 第七回 UrlHelper

    这节讲 一下ASP.NET MVC中的Helper. 何谓Helper,其实就是在View中为了实现一些灵活功能而写的方法组. 其实ASP.NET MVC的View是Aspx的页面,本身可以声明定义方 ...

  6. 移动web前端小结(一)

    这段时间做了几个移动项目的前端页面,姑且称之webapp.做这几个项目之前根本没接触过移动端的相关知识,以为和PC端页面没啥区别无非就是尺寸小一点罢了.上手以后发现问题颇多.下面从框架.相关知识点.遇 ...

  7. NodeJS学习笔记—2.AMD规范

    CommonJS加载模块是同步的,而AMD模块加在是非同步的,允许指定回调函数.由于Nodejs主要用于服务器编程,模块文件一般都存在于本地,所以加载很快,不需要考虑非同步加载,用CommonJS即可 ...

  8. swift 关于闭包和函数

    调用函数,有闭包参数时: 函数的实现中:闭包为参数时,有参数返回值类型: 调用闭包时,传入参数 调用函数时:闭包为参数,是闭包的实现,当闭包为最后一个参数时,可写在参数括号外面 即===>函数在 ...

  9. 注解 @RequestMapping

    通过RequestMapping注解可以定义不同的处理器映射规则. 1.URL路径映射 @RequestMapping(value="/item")或@RequestMapping ...

  10. 将CString(unicode)转换为char*(ANSI)

    1.将CString(unicode)转换为char*(ANSI) CString strServIP; pChat->GetDlgItemText(IDC_IP,strServIP); ] = ...