OpenDDS  Snapshot(2023/04/07-19:43)
Public Member Functions | Static Public Member Functions | Private Types | Private Attributes | Friends | List of all members
OpenDDS::DCPS::FreeIndex Class Reference

#include <MemoryPool.h>

Collaboration diagram for OpenDDS::DCPS::FreeIndex:
Collaboration graph
[legend]

Public Member Functions

 FreeIndex (FreeHeader *&largest_free)
 
void init (FreeHeader *init_free_block)
 
void add (FreeHeader *free_block)
 
void remove (FreeHeader *free_block, FreeHeader *next_largest)
 
FreeHeaderfind (size_t size, unsigned char *base)
 

Static Public Member Functions

static unsigned int node_index (size_t size)
 

Private Types

enum  { min_index_pow = 3, max_index_pow = 12 }
 
enum  { min_index = 8, max_index = 4096 }
 

Private Attributes

size_t size_
 Number of index nodes. More...
 
FreeHeader *& largest_free_
 Memory pool's pointer to largest free block. More...
 
FreeIndexNode nodes_ [max_index_pow - min_index_pow+1]
 Index nodes. More...
 

Friends

class Test::MemoryPoolTest
 
class Test::FreeIndexTest
 

Detailed Description

Index of free nodes in memory pool. Allows for a faster search of free nodes

Definition at line 118 of file MemoryPool.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
private
Enumerator
min_index_pow 
max_index_pow 

Definition at line 143 of file MemoryPool.h.

◆ anonymous enum

anonymous enum
private
Enumerator
min_index 
max_index 

Definition at line 147 of file MemoryPool.h.

147  {
148  min_index = 8, // 2^^3
149  max_index = 4096 // 2^^12
150  };

Constructor & Destructor Documentation

◆ FreeIndex()

OpenDDS::DCPS::FreeIndex::FreeIndex ( FreeHeader *&  largest_free)
explicit

Definition at line 161 of file MemoryPool.cpp.

162 : size_(0)
163 , largest_free_(largest_free)
164 {
165 }
size_t size_
Number of index nodes.
Definition: MemoryPool.h:152
FreeHeader *& largest_free_
Memory pool&#39;s pointer to largest free block.
Definition: MemoryPool.h:153

Member Function Documentation

◆ add()

void OpenDDS::DCPS::FreeIndex::add ( FreeHeader free_block)

Add free block to index

Definition at line 168 of file MemoryPool.cpp.

References node_index(), nodes_, OpenDDS::DCPS::FreeIndexNode::set_ptr(), and OpenDDS::DCPS::AllocHeader::size().

Referenced by init(), and OpenDDS::DCPS::MemoryPool::insert_free_alloc().

169 {
170  unsigned int index = node_index(freed->size());
171  FreeIndexNode* node = nodes_ + index;
172 
173  // If the node is empty, or if freed is smaller or equal to the node's alloc
174  if ((node->ptr() == NULL) || (node->ptr()->size() >= freed->size())) {
175  // Use this alloc in the index
176  node->set_ptr(freed);
177  }
178 }
FreeIndexNode nodes_[max_index_pow - min_index_pow+1]
Index nodes.
Definition: MemoryPool.h:154
static unsigned int node_index(size_t size)
Definition: MemoryPool.cpp:243
void set_ptr(FreeHeader *ptr)
Definition: MemoryPool.h:98

◆ find()

FreeHeader * OpenDDS::DCPS::FreeIndex::find ( size_t  size,
unsigned char *  base 
)

Find smallest free block of size or larger

Definition at line 209 of file MemoryPool.cpp.

References largest_free_, node_index(), nodes_, OpenDDS::DCPS::FreeIndexNode::ptr(), OpenDDS::DCPS::AllocHeader::size(), size_, and OpenDDS::DCPS::FreeHeader::smaller_free().

Referenced by OpenDDS::DCPS::MemoryPool::insert_free_alloc(), node_index(), and OpenDDS::DCPS::MemoryPool::pool_alloc().

210 {
211  unsigned int index = node_index(search_size);
212  FreeIndexNode* index_node = nodes_ + index;
213 
214  // Larger or equal to search_size
215  FreeHeader* result = NULL;
216  if (largest_free_ && (largest_free_->size() >= search_size)) {
217  result = largest_free_;
218 
219  // Look from here and larger
220  while (index_node < nodes_ + size_) {
221  if (index_node->ptr() && index_node->ptr()->size() >= search_size) {
222  result = index_node->ptr();
223  break;
224  }
225  ++index_node;
226  }
227  }
228 
229  // Now traverse, searching for smaller than result
230  while (result) {
231  FreeHeader* smaller = result->smaller_free(pool_base);
232  if (smaller && smaller->size() >= search_size) {
233  result = smaller;
234  } else {
235  break;
236  }
237  }
238 
239  return result;
240 }
FreeIndexNode nodes_[max_index_pow - min_index_pow+1]
Index nodes.
Definition: MemoryPool.h:154
unsigned char * ptr() const
Definition: MemoryPool.cpp:42
static unsigned int node_index(size_t size)
Definition: MemoryPool.cpp:243
unsigned int size() const
Definition: MemoryPool.h:30
size_t size_
Number of index nodes.
Definition: MemoryPool.h:152
FreeHeader *& largest_free_
Memory pool&#39;s pointer to largest free block.
Definition: MemoryPool.h:153

◆ init()

void OpenDDS::DCPS::FreeIndex::init ( FreeHeader init_free_block)

Initialize index with initial free block

Definition at line 198 of file MemoryPool.cpp.

References add(), max_index, min_index, nodes_, OpenDDS::DCPS::FreeIndexNode::set_sizes(), and size_.

Referenced by OpenDDS::DCPS::MemoryPool::MemoryPool().

199 {
200  size_t max = std::numeric_limits<size_t>::max();
201  for (size_t size = min_index; size <= max_index; size *= 2) {
202  nodes_[size_].set_sizes(size, (size == max_index) ? max : size*2);
203  ++size_;
204  }
205  add(init_free_block);
206 }
FreeIndexNode nodes_[max_index_pow - min_index_pow+1]
Index nodes.
Definition: MemoryPool.h:154
void add(FreeHeader *free_block)
Definition: MemoryPool.cpp:168
size_t size_
Number of index nodes.
Definition: MemoryPool.h:152
void set_sizes(size_t size, size_t limit)
Definition: MemoryPool.cpp:155

◆ node_index()

unsigned int OpenDDS::DCPS::FreeIndex::node_index ( size_t  size)
static

Calculate index of node corresponding to a size

Definition at line 243 of file MemoryPool.cpp.

References find(), max_index, max_index_pow, min_index, min_index_pow, nodes_, ACE_OS::printf(), OpenDDS::DCPS::AllocHeader::ptr(), OpenDDS::DCPS::FreeIndexNode::ptr(), OpenDDS::DCPS::AllocHeader::size(), OpenDDS::DCPS::FreeIndexNode::size(), size_, OpenDDS::DCPS::FreeHeader::smaller_free(), and TEST_CHECK.

Referenced by add(), find(), and remove().

244 {
245  // Use shifting to perform log base 2 of size
246  // start by using min + 1 (+1 because min is a power of 2 whch is already
247  // one bit)
248  size_t size_copy = size >> (min_index_pow + 1);
249  unsigned int index = 0;
250  unsigned int max_idx = max_index_pow - min_index_pow;
251  while (size_copy && (index < max_idx)) {
252  ++index;
253  size_copy = size_copy >> 1;
254  }
255  return index;
256 }

◆ remove()

void OpenDDS::DCPS::FreeIndex::remove ( FreeHeader free_block,
FreeHeader next_largest 
)

Remove free block from index

Definition at line 181 of file MemoryPool.cpp.

References node_index(), nodes_, OpenDDS::DCPS::FreeIndexNode::set_ptr(), and OpenDDS::DCPS::AllocHeader::size().

Referenced by OpenDDS::DCPS::MemoryPool::remove_free_alloc().

182 {
183  unsigned int index = node_index(free_block->size());
184  FreeIndexNode* node = nodes_ + index;
185 
186  // If the node points to the free block
187  if (node->ptr() == free_block) {
188  // If the larger can be used by this node
189  if (larger && node->contains(larger->size())) {
190  node->set_ptr(larger);
191  } else {
192  node->set_ptr(NULL);
193  }
194  }
195 }
FreeIndexNode nodes_[max_index_pow - min_index_pow+1]
Index nodes.
Definition: MemoryPool.h:154
static unsigned int node_index(size_t size)
Definition: MemoryPool.cpp:243
void set_ptr(FreeHeader *ptr)
Definition: MemoryPool.h:98

Friends And Related Function Documentation

◆ Test::FreeIndexTest

friend class Test::FreeIndexTest
friend

Definition at line 120 of file MemoryPool.h.

◆ Test::MemoryPoolTest

friend class Test::MemoryPoolTest
friend

Definition at line 119 of file MemoryPool.h.

Member Data Documentation

◆ largest_free_

FreeHeader*& OpenDDS::DCPS::FreeIndex::largest_free_
private

Memory pool's pointer to largest free block.

Definition at line 153 of file MemoryPool.h.

Referenced by find().

◆ nodes_

FreeIndexNode OpenDDS::DCPS::FreeIndex::nodes_[max_index_pow - min_index_pow+1]
private

Index nodes.

Definition at line 154 of file MemoryPool.h.

Referenced by add(), find(), init(), node_index(), and remove().

◆ size_

size_t OpenDDS::DCPS::FreeIndex::size_
private

Number of index nodes.

Definition at line 152 of file MemoryPool.h.

Referenced by find(), init(), and node_index().


The documentation for this class was generated from the following files: