ACE内存分配器二
2007-07-28 00:12
218 查看
ACE_Free_List是一个空闲链表的接口
template <class T> //链表节点的类型
class ACE_Free_List
{
public:
virtual ~ACE_Free_List (void); //移除(释放)链表中的所有节点
virtual void add (T *element) = 0; //把一个新节点添加到链表中,如果没有超出高水位线
virtual T *remove (void) = 0; //拿走一个节点,如果低于了低水位线,内部将回自动创建新的节点
virtual size_t size (void) = 0; //当前链表中的节点个数
virtual void resize (size_t newsize) = 0;//重修调整链表的节点数到指定的值
};
ACE_Locked_Free_List 实现一个线程安全的链表
template <class T, class ACE_LOCK> //节点类型和锁类型
class ACE_Locked_Free_List : public ACE_Free_List<T>
{
//这里有个限制,节点类型必须拥有2个方法get_next和set_next
public:
ACE_Locked_Free_List (int mode = ACE_FREE_LIST_WITH_POOL, //操作类型
size_t prealloc = ACE_DEFAULT_FREE_LIST_PREALLOC, //预创建节点数
size_t lwm = ACE_DEFAULT_FREE_LIST_LWM, //低水位线
size_t hwm = ACE_DEFAULT_FREE_LIST_HWM, //高水位线
size_t inc = ACE_DEFAULT_FREE_LIST_INC); //每次增加节点时,增加的节点数
virtual ~ACE_Locked_Free_List (void);
virtual void add (T *element);
virtual T *remove (void);
virtual size_t size (void);
virtual void resize (size_t newsize);
protected:
virtual void alloc (size_t n); //增加n个节点到链表中
virtual void dealloc (size_t n); //从链表中释放n个节点
int mode_;
T *free_list_; //指向链表的第一个节点
size_t lwm_;
size_t hwm_;
size_t inc_;
size_t size_;
ACE_LOCK mutex_; //同步锁
}
在构造函数中必须指定链表的操作类型(mode成员变量),这里定义的有2个类型
# define ACE_FREE_LIST_WITH_POOL 1
所有的链表节点由链表在内部自动创建,并且负责释放这些节点
# define ACE_PURE_FREE_LIST 2
一个简单的链表,不负责任何节点的创建和释放
现在我们来看看各个函数的实现
template <class T, class ACE_LOCK>
ACE_Locked_Free_List<T, ACE_LOCK>::~ACE_Locked_Free_List (void)
{
if (this->mode_ != ACE_PURE_FREE_LIST) //判断操作类型决定是否释放链表
while (this->free_list_ != 0) //循环释放每个节点
{
T *temp = this->free_list_;
this->free_list_ = this->free_list_->get_next ();
delete temp;
}
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::add (T *element)
{
ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_)); //同步,我们可以自己同过宏ACE_MT_SAFE来控制是否需要同步
//如果操作类型是ACE_PURE_FREE_LIST则把节点添加到链表中,否则我们就要判断当前的节点数是否超过了高水位线,如果超过了就释放该节点,否则就添加到链表中
if (this->mode_ == ACE_PURE_FREE_LIST
|| this->size_ < this->hwm_)
{
element->set_next (this->free_list_);
this->free_list_ = element;
this->size_++;
}
else
delete element;
}
template <class T, class ACE_LOCK> T *
ACE_Locked_Free_List<T, ACE_LOCK>::remove (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, 0));
//如果类型不是ACE_PURE_FREE_LIST ,且节点数低于水位线,则我们创建inc_个节点
if (this->mode_ != ACE_PURE_FREE_LIST && this->size_ <= this->lwm_)
this->alloc (this->inc_);
T *temp = this->free_list_; //分配节点
if (temp != 0)
{
this->free_list_ = this->free_list_->get_next (); //更新头节点信息
this->size_--;
}
return temp;
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::resize (size_t newsize)
{
ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_));
if (this->mode_ != ACE_PURE_FREE_LIST) //判断是否进行调整,如果节点是链表自己创建的则进行节点数调整,增加或者释放相应的节点数
if (newsize < this->size_)
this->dealloc (this->size_ - newsize);
else
this->alloc (newsize - this->size_);
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::alloc (size_t n)
{
for (; n > 0; n--) //循环创建n个节点
{
T *temp = 0;
ACE_NEW (temp, T);
temp->set_next (this->free_list_);
this->free_list_ = temp;
this->size_++;
}
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::dealloc (size_t n) //循环释放n个节点
{
for (; this->free_list_ != 0 && n > 0;
n--)
{
T *temp = this->free_list_;
this->free_list_ = this->free_list_->get_next ();
delete temp;
this->size_--;
}
}
template <class T> //链表节点的类型
class ACE_Free_List
{
public:
virtual ~ACE_Free_List (void); //移除(释放)链表中的所有节点
virtual void add (T *element) = 0; //把一个新节点添加到链表中,如果没有超出高水位线
virtual T *remove (void) = 0; //拿走一个节点,如果低于了低水位线,内部将回自动创建新的节点
virtual size_t size (void) = 0; //当前链表中的节点个数
virtual void resize (size_t newsize) = 0;//重修调整链表的节点数到指定的值
};
ACE_Locked_Free_List 实现一个线程安全的链表
template <class T, class ACE_LOCK> //节点类型和锁类型
class ACE_Locked_Free_List : public ACE_Free_List<T>
{
//这里有个限制,节点类型必须拥有2个方法get_next和set_next
public:
ACE_Locked_Free_List (int mode = ACE_FREE_LIST_WITH_POOL, //操作类型
size_t prealloc = ACE_DEFAULT_FREE_LIST_PREALLOC, //预创建节点数
size_t lwm = ACE_DEFAULT_FREE_LIST_LWM, //低水位线
size_t hwm = ACE_DEFAULT_FREE_LIST_HWM, //高水位线
size_t inc = ACE_DEFAULT_FREE_LIST_INC); //每次增加节点时,增加的节点数
virtual ~ACE_Locked_Free_List (void);
virtual void add (T *element);
virtual T *remove (void);
virtual size_t size (void);
virtual void resize (size_t newsize);
protected:
virtual void alloc (size_t n); //增加n个节点到链表中
virtual void dealloc (size_t n); //从链表中释放n个节点
int mode_;
T *free_list_; //指向链表的第一个节点
size_t lwm_;
size_t hwm_;
size_t inc_;
size_t size_;
ACE_LOCK mutex_; //同步锁
}
在构造函数中必须指定链表的操作类型(mode成员变量),这里定义的有2个类型
# define ACE_FREE_LIST_WITH_POOL 1
所有的链表节点由链表在内部自动创建,并且负责释放这些节点
# define ACE_PURE_FREE_LIST 2
一个简单的链表,不负责任何节点的创建和释放
现在我们来看看各个函数的实现
template <class T, class ACE_LOCK>
ACE_Locked_Free_List<T, ACE_LOCK>::~ACE_Locked_Free_List (void)
{
if (this->mode_ != ACE_PURE_FREE_LIST) //判断操作类型决定是否释放链表
while (this->free_list_ != 0) //循环释放每个节点
{
T *temp = this->free_list_;
this->free_list_ = this->free_list_->get_next ();
delete temp;
}
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::add (T *element)
{
ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_)); //同步,我们可以自己同过宏ACE_MT_SAFE来控制是否需要同步
//如果操作类型是ACE_PURE_FREE_LIST则把节点添加到链表中,否则我们就要判断当前的节点数是否超过了高水位线,如果超过了就释放该节点,否则就添加到链表中
if (this->mode_ == ACE_PURE_FREE_LIST
|| this->size_ < this->hwm_)
{
element->set_next (this->free_list_);
this->free_list_ = element;
this->size_++;
}
else
delete element;
}
template <class T, class ACE_LOCK> T *
ACE_Locked_Free_List<T, ACE_LOCK>::remove (void)
{
ACE_MT (ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, 0));
//如果类型不是ACE_PURE_FREE_LIST ,且节点数低于水位线,则我们创建inc_个节点
if (this->mode_ != ACE_PURE_FREE_LIST && this->size_ <= this->lwm_)
this->alloc (this->inc_);
T *temp = this->free_list_; //分配节点
if (temp != 0)
{
this->free_list_ = this->free_list_->get_next (); //更新头节点信息
this->size_--;
}
return temp;
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::resize (size_t newsize)
{
ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_));
if (this->mode_ != ACE_PURE_FREE_LIST) //判断是否进行调整,如果节点是链表自己创建的则进行节点数调整,增加或者释放相应的节点数
if (newsize < this->size_)
this->dealloc (this->size_ - newsize);
else
this->alloc (newsize - this->size_);
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::alloc (size_t n)
{
for (; n > 0; n--) //循环创建n个节点
{
T *temp = 0;
ACE_NEW (temp, T);
temp->set_next (this->free_list_);
this->free_list_ = temp;
this->size_++;
}
}
template <class T, class ACE_LOCK> void
ACE_Locked_Free_List<T, ACE_LOCK>::dealloc (size_t n) //循环释放n个节点
{
for (; this->free_list_ != 0 && n > 0;
n--)
{
T *temp = this->free_list_;
this->free_list_ = this->free_list_->get_next ();
delete temp;
this->size_--;
}
}
相关文章推荐
- ACE内存分配器二
- ACE内存分配器一
- ACE框架 基于共享内存的分配器 (算法设计)
- ACE内存分配器一
- ACE框架 基于共享内存的分配器
- 多线程的内存分配器mt_alloc
- CoreCLR源码探索(三) GC内存分配器的内部实现
- [内存管理]连续内存分配器(CMA)概述
- 自带内存分配器的内存检测方法
- 内存分配器之TCMalloc
- boot memory allocator——自举内存分配器(一:基本介绍)
- GFP-Tree 内存分配器
- ACE的内存分配介绍
- Linux内核最新的连续内存分配器(CMA)——避免预留大块内存 推荐
- genalloc — 通用内存分配器
- 推荐一个跨平台内存分配器 - feixuwu - C++博客
- TrafficServer内存分配器优化
- 内存分配(3)–SGI STL的内存分配器
- STL中的内存分配器原理
- 内存管理之一:STL中的内存分配器