#ifndef ACE_FREE_LIST_CPP #define ACE_FREE_LIST_CPP #include "ace/Free_List.h" #include "ace/Guard_T.h" #if defined (ACE_HAS_ALLOC_HOOKS) # include "ace/Malloc_Base.h" #endif /* ACE_HAS_ALLOC_HOOKS */ #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ ACE_BEGIN_VERSIONED_NAMESPACE_DECL // Default constructor that takes in a preallocation number // (), a low and high water mark ( and ) and an // increment value () template ACE_Locked_Free_List::ACE_Locked_Free_List (int mode, size_t prealloc, size_t lwm, size_t hwm, size_t inc) : mode_ (mode), free_list_ (0), lwm_ (lwm), hwm_ (hwm), inc_ (inc), size_ (0) { this->alloc (prealloc); } // Destructor - removes all the elements from the free_list template ACE_Locked_Free_List::~ACE_Locked_Free_List () { 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; } } // Inserts an element onto the free list (if we are allowed to manage // elements withing and it pasts the high water mark, delete the // element) template void ACE_Locked_Free_List::add (T *element) { ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_)); // Check to see that we not at the high water mark. 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; } // Takes a element off the freelist and returns it. It creates // new elements if we are allowed to do it and the size is at the low // water mark. template T * ACE_Locked_Free_List::remove () { ACE_MT (ACE_GUARD_RETURN (ACE_LOCK, ace_mon, this->mutex_, 0)); // If we are at the low water mark, add some nodes if (this->mode_ != ACE_PURE_FREE_LIST && this->size_ <= this->lwm_) this->alloc (this->inc_); // Remove a node T *temp = this->free_list_; if (temp != 0) { this->free_list_ = this->free_list_->get_next (); this->size_--; } return temp; } // Returns the current size of the free list template size_t ACE_Locked_Free_List::size () { return this->size_; } // Resizes the free list to template void ACE_Locked_Free_List::resize (size_t newsize) { ACE_MT (ACE_GUARD (ACE_LOCK, ace_mon, this->mutex_)); // Check if we are allowed to resize if (this->mode_ != ACE_PURE_FREE_LIST) { // Check to see if we grow or shrink if (newsize < this->size_) { this->dealloc (this->size_ - newsize); } else { this->alloc (newsize - this->size_); } } } // Allocates extra nodes for the freelist template void ACE_Locked_Free_List::alloc (size_t n) { for (; n > 0; n--) { T *temp = 0; ACE_NEW (temp, T); temp->set_next (this->free_list_); this->free_list_ = temp; this->size_++; } } // Removes and frees nodes from the freelist. template void ACE_Locked_Free_List::dealloc (size_t 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_ALLOC_HOOK_DEFINE_Tcc(ACE_Locked_Free_List) ACE_END_VERSIONED_NAMESPACE_DECL #endif /* ACE_FREE_LIST_CPP */