8 #ifndef OPENDDS_DCPS_MEMORYPOOL_H 9 #define OPENDDS_DCPS_MEMORYPOOL_H 30 unsigned int size()
const {
return is_free() ? -alloc_size_ : alloc_size_; }
32 unsigned int prev_size()
const {
return prev_size_; }
34 bool is_free()
const {
return alloc_size_ < 0; }
37 unsigned char* ptr()
const;
46 void allocate(
size_t size);
49 void set_size(
size_t size);
53 void set_allocated() {
if (alloc_size_ < 0) alloc_size_ = - alloc_size_; }
70 void init_free_block(
unsigned int pool_size);
76 FreeHeader* smaller_free(
unsigned char* pool_base)
const;
78 FreeHeader* larger_free(
unsigned char* pool_base)
const;
81 void set_smaller_free(
FreeHeader* next,
unsigned char* pool_base);
83 void set_larger_free(
FreeHeader* prev,
unsigned char* pool_base);
100 void set_sizes(
size_t size,
size_t limit);
108 unsigned int size()
const {
return static_cast<unsigned int>(
size_); }
119 friend class Test::MemoryPoolTest;
120 friend class Test::FreeIndexTest;
135 static unsigned int node_index(
size_t size);
137 #ifdef VALIDATE_MEMORY_POOL 138 static void validate_index(
FreeIndex& index,
163 friend class Test::MemoryPoolTest;
165 explicit MemoryPool(
unsigned int pool_size,
size_t granularity = 8);
170 return (pool_ptr_ <= ptr) && (ptr < pool_ptr_ + pool_size_); }
173 void* pool_alloc(
size_t size);
178 bool pool_free(
void* ptr);
181 size_t lwm_free_bytes()
const;
184 static size_t align(
size_t size,
size_t granularity) {
185 return (size + granularity - 1) / granularity * granularity; }
187 size_t size ()
const {
return pool_size_; }
204 void remove_free_alloc(
FreeHeader* block_to_alloc);
205 void insert_free_alloc(
FreeHeader* block_freed);
206 void join_free_allocs(
FreeHeader* block_freed);
207 unsigned char* allocate(
FreeHeader* free_block,
size_t alloc_size);
212 #ifdef VALIDATE_MEMORY_POOL 213 static void validate_pool(
MemoryPool& pool,
bool log =
false);
221 #endif // OPENDDS_MEMORY_POOL_H
int alloc_size_
Size of my buffer, negative if free, positive if alloc.
size_t size_
Number of index nodes.
unsigned char * pool_ptr_
Pointer to pool.
FreeIndex free_index_
Index of free nodex.
#define OpenDDS_Dcps_Export
const size_t min_alloc_size_
Aligned minimum allocation size.
bool includes(void *ptr) const
size_t lwm_free_bytes_
Low water mark of available bytes.
bool contains(size_t size)
void set_ptr(FreeHeader *ptr)
FreeHeader *& largest_free_
Memory pool's pointer to largest free block.
size_t size_
size of buffer
FreeHeader * ptr_
points to smallest free alloc of size_ or larger
FreeHeader * largest_free_
Pointer to largest free index.
unsigned int size() const
const size_t granularity_
Configured granularity.
const size_t pool_size_
Configured pool size.
size_t limit_
upper_limit of buffer size (one too large)
static size_t align(size_t size, size_t granularity)
int prev_size_
Size of previous buffer, or 0 if first, never negative.
int find(const PG_Property_Set &decoder, const ACE_CString &key, TYPE &value)
size_t offset_larger_free_
Offset to larger free block in size order.
void set_prev_size(int size)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
unsigned int prev_size() const
unsigned int size() const
size_t offset_smaller_free_
Offset to smaller free block in size order.
The Internal API and Implementation of OpenDDS.