📄 cached_allocator_t.cpp
字号:
// Cached_Allocator_T.cpp,v 1.1 2003/08/25 07:46:52 kobica Exp
#ifndef JAWS_CACHED_ALLOCATOR_T_CPP
#define JAWS_CACHED_ALLOCATOR_T_CPP
#include "jaws3/Cached_Allocator_T.h"
template <class T, class ACE_LOCK> char *
JAWS_Cached_Allocator<T, ACE_LOCK>::get_next_pool (char *pool)
{
char *next = 0;
char *next_indirect = pool + (this->pool_size_);
memcpy (&next, next_indirect, sizeof (char *));
return next;
}
template <class T, class ACE_LOCK> void
JAWS_Cached_Allocator<T, ACE_LOCK>::set_next_pool (char *pool, char *next_pool)
{
char *next_indirect = pool + (this->pool_size_);
memcpy (next_indirect, &next_pool, sizeof (char *));
}
template <class T, class ACE_LOCK> void
JAWS_Cached_Allocator<T, ACE_LOCK>::extend_pool (void)
{
char *new_pool = 0;
ACE_NEW (new_pool, char[this->pool_size_ + sizeof (char *)]);
for (size_t c = 0; c < (this->pool_size_ / sizeof (T)); c++)
{
void* placement = new_pool + c * sizeof(T);
this->free_list_.add (new (placement) ACE_Cached_Mem_Pool_Node<T>);
this->set_next_pool (new_pool, 0);
}
if (this->pool_head_ == 0)
this->pool_head_ = this->pool_tail_ = new_pool;
else
this->set_next_pool (this->pool_tail_, new_pool);
this->pool_tail_ = new_pool;
}
template <class T, class ACE_LOCK>
JAWS_Cached_Allocator<T, ACE_LOCK>::JAWS_Cached_Allocator (size_t n_chunks)
: pool_size_ (n_chunks * sizeof (T))
, pool_head_ (0)
, pool_tail_ (0)
, free_list_ (ACE_PURE_FREE_LIST)
{
this->extend_pool ();
}
template <class T, class ACE_LOCK>
JAWS_Cached_Allocator<T, ACE_LOCK>::~JAWS_Cached_Allocator (void)
{
char *curr = this->pool_head_;
while (curr)
{
char *next = this->get_next_pool (curr);
delete [] curr;
curr = next;
}
}
template <class T, class ACE_LOCK> void *
JAWS_Cached_Allocator<T, ACE_LOCK>::malloc (size_t nbytes)
{
if (nbytes > sizeof (T))
return NULL;
ACE_Cached_Mem_Pool_Node<T> *node = 0;
node = this->free_list_.remove ();
if (node == 0)
{
this->extend_pool ();
node = this->free_list_.remove ();
// ASSERT node != 0
}
// addr() call is really not absolutely necessary because of the way
// ACE_Cached_Mem_Pool_Node's internal structure arranged.
return node->addr ();
}
template <class T, class ACE_LOCK> void
JAWS_Cached_Allocator<T, ACE_LOCK>::free (void *ptr)
{
this->free_list_.add ((ACE_Cached_Mem_Pool_Node<T> *) ptr);
}
template <class T> JAWS_Cached_Allocator<T, ACE_SYNCH_NULL_MUTEX> *
JAWS_TSS_Cached_Allocator<T>::ts_allocator (void)
{
JAWS_Cached_Allocator<T, ACE_SYNCH_NULL_MUTEX> *ts_obj = 0;
ts_obj = this->ts_allocator_.ts_object ();
// Don't need double-check locking since this value is
// obtained from a thread specific context.
if (ts_obj == 0)
{
ACE_NEW_RETURN (ts_obj,
JAWS_CACHED_ALLOCATOR(T) (this->n_chunks_),
0);
this->ts_allocator_.ts_object (ts_obj);
}
return ts_obj;
}
template <class T>
JAWS_TSS_Cached_Allocator<T>::JAWS_TSS_Cached_Allocator (size_t n_chunks)
: n_chunks_ (n_chunks)
{
}
template <class T>
JAWS_TSS_Cached_Allocator<T>::~JAWS_TSS_Cached_Allocator (void)
{
}
template <class T> void *
JAWS_TSS_Cached_Allocator<T>::malloc (size_t nbytes)
{
return this->ts_allocator ()->malloc (nbytes);
}
template <class T> void
JAWS_TSS_Cached_Allocator<T>::free (void *ptr)
{
this->ts_allocator ()->free (ptr);
}
#endif /* JAWS_CACHED_ALLOCATOR_T_CPP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -