18 #if defined(WITH_VALGRIND) 19 #include "valgrind/memcheck.h" 22 #define TEST_CHECK(COND) \ 25 ACE_OS::snprintf(msg, 1024, "%s: FAILED at %s:%d", #COND, __FILE__, __LINE__); \ 26 ACE_OS::printf("%s\n", msg); \ 27 throw std::runtime_error(msg); \ 33 namespace OpenDDS {
namespace DCPS {
44 const unsigned char* buff =
reinterpret_cast<const unsigned char*
>(
this + 1);
45 return const_cast<unsigned char*
>(buff);
50 unsigned char* past_buffer_end =
ptr() +
size();
51 return reinterpret_cast<AllocHeader*
>(past_buffer_end);
58 unsigned char*
self =
reinterpret_cast<unsigned char*
>(
this);
59 unsigned char* prev_buffer_start =
self -
prev_size_;
60 unsigned char* past_alloc = prev_buffer_start -
sizeof(
AllocHeader);
61 result =
reinterpret_cast<AllocHeader*
>(past_alloc);
103 set_smaller_free(NULL, NULL);
104 set_larger_free(NULL, NULL);
111 if (offset_smaller_free_ != std::numeric_limits<size_t>::max()) {
112 result =
reinterpret_cast<FreeHeader*
>(pool_base + offset_smaller_free_);
121 if (offset_larger_free_ != std::numeric_limits<size_t>::max()) {
122 result =
reinterpret_cast<FreeHeader*
>(pool_base + offset_larger_free_);
131 offset_smaller_free_ =
reinterpret_cast<unsigned char*
>(next) - pool_base;
133 offset_smaller_free_ = std::numeric_limits<size_t>::max();
141 offset_larger_free_ =
reinterpret_cast<unsigned char*
>(prev) - pool_base;
143 offset_larger_free_ = std::numeric_limits<size_t>::max();
163 , largest_free_(largest_free)
174 if ((node->ptr() == NULL) || (node->ptr()->size() >= freed->
size())) {
187 if (node->ptr() == free_block) {
189 if (larger && node->contains(larger->
size())) {
200 size_t max = std::numeric_limits<size_t>::max();
205 add(init_free_block);
221 if (index_node->
ptr() && index_node->
ptr()->
size() >= search_size) {
222 result = index_node->
ptr();
232 if (smaller && smaller->
size() >= search_size) {
249 unsigned int index = 0;
251 while (size_copy && (index < max_idx)) {
253 size_copy = size_copy >> 1;
258 #ifdef VALIDATE_MEMORY_POOL 260 FreeIndex::validate_index(
FreeIndex& index,
unsigned char* base,
bool log)
278 if (size_or_larger) {
301 : granularity_(
align(granularity, 8))
303 , pool_size_(
align(pool_size, granularity_))
304 , pool_ptr_(new unsigned char[pool_size_])
314 #if defined(WITH_VALGRIND) 316 VALGRIND_CREATE_MEMPOOL(
pool_ptr_, 0,
false);
322 #ifndef OPENDDS_SAFETY_PROFILE 336 #if defined(WITH_VALGRIND) 341 unsigned char* block = NULL;
353 if (block_to_alloc) {
354 block =
allocate(block_to_alloc, aligned_size);
363 #ifdef VALIDATE_MEMORY_POOL 364 validate_pool(*
this,
false);
367 #if defined(WITH_VALGRIND) 369 VALGRIND_MEMPOOL_ALLOC(
pool_ptr_, block, size);
380 #if defined(WITH_VALGRIND) 392 #ifdef VALIDATE_MEMORY_POOL 393 validate_pool(*
this,
false);
398 #if defined(WITH_VALGRIND) 498 size_t free_block_size = free_block->
size();
499 size_t remainder = free_block_size - alloc_size;
503 alloc_size = free_block_size;
533 return alloc_block->
ptr();
539 return free_block->
ptr();
561 #ifdef VALIDATE_MEMORY_POOL 563 MemoryPool::validate_pool(
MemoryPool& pool,
bool log) {
565 size_t allocated_bytes = 0;
566 size_t free_bytes = 0;
568 size_t free_count = 0;
573 typedef std::map<FreeHeader*, int> FreeMap;
581 free_map[free_header] = index;
590 (
unsigned long)pool_end);
606 FreeMap::const_iterator found;
608 if (found != free_map.end()) {
609 smlr_index = found->second;
610 snprintf(smlr_buff, 32,
"[%2d]", smlr_index);
613 if (found != free_map.end()) {
614 lrgr_index = found->second;
615 snprintf(lrgr_buff, 32,
"[%2d]", lrgr_index);
619 "Alloc[%zu] %s at %zx ptr %zx lg %s sm %s size %d psize %d\n",
623 (
unsigned long)alloc,
624 (
unsigned long)alloc->
ptr(),
625 lrgr_index >= 0 ? lrgr_buff :
"[ ]",
626 smlr_index >= 0 ? smlr_buff :
"[ ]",
641 allocated_bytes += alloc->
size();
642 prev_was_free =
false;
644 free_bytes += alloc->
size();
645 prev_was_free =
true;
651 TEST_CHECK((
unsigned char*)alloc == pool_end);
657 size_t prev_size = 0;
658 size_t free_bytes_in_list = 0;
672 free_bytes_in_list += free_alloc->
size();
679 prev_size = free_alloc->
size();
680 prev_free = free_alloc;
687 free_bytes_in_list = 0;
689 for (free_alloc = prev_free;
696 free_bytes_in_list += free_alloc->
size();
699 if (free_alloc != prev_free) {
703 prev_size = free_alloc->
size();
void add(FreeHeader *free_block)
int alloc_size_
Size of my buffer, negative if free, positive if alloc.
void set_sizes(size_t size, size_t limit)
void insert_free_alloc(FreeHeader *block_freed)
bool pool_free(void *ptr)
void set_larger_free(FreeHeader *prev, unsigned char *pool_base)
FreeHeader * larger_free(unsigned char *pool_base) const
size_t size_
Number of index nodes.
unsigned char * pool_ptr_
Pointer to pool.
FreeIndex free_index_
Index of free nodex.
int snprintf(char *buf, size_t maxlen, const char *format,...) ACE_GCC_FORMAT_ATTRIBUTE(printf
void remove_free_alloc(FreeHeader *block_to_alloc)
static unsigned int node_index(size_t size)
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.
void join_free_allocs(FreeHeader *block_freed)
bool joinable_prev(FreeHeader *freed)
void set_ptr(FreeHeader *ptr)
void init(FreeHeader *init_free_block)
FreeHeader *& largest_free_
Memory pool's pointer to largest free block.
size_t size_
size of buffer
FreeHeader * largest_free_
Pointer to largest free index.
FreeIndex(FreeHeader *&largest_free)
FreeIndexNode nodes_[max_index_pow - min_index_pow+1]
Index nodes.
Christopher Diggins *renamed files *fixing compilation errors *adding Visual C project file *removed make Max Lybbert *removed references to missing and unused header
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)
unsigned char * ptr() const
void set_smaller_free(FreeHeader *next, unsigned char *pool_base)
bool joinable_next(FreeHeader *freed)
OpenDDS_Dcps_Export void align(size_t &value, size_t by)
Align "value" by "by" if it's not already.
AllocHeader * prev_adjacent()
int prev_size_
Size of previous buffer, or 0 if first, never negative.
void remove(FreeHeader *free_block, FreeHeader *next_largest)
void set_prev_size(int size)
int printf(const char *format,...) ACE_GCC_FORMAT_ATTRIBUTE(printf
unsigned char * allocate(FreeHeader *free_block, size_t alloc_size)
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
unsigned int prev_size() const
unsigned int size() const
AllocHeader * next_adjacent()
MemoryPool(unsigned int pool_size, size_t granularity=8)
void init_free_block(unsigned int pool_size)
FreeHeader * smaller_free(unsigned char *pool_base) const
size_t lwm_free_bytes() const
FreeHeader * find(size_t size, unsigned char *base)
The Internal API and Implementation of OpenDDS.
void allocate(size_t size)
void set_size(size_t size)
void * pool_alloc(size_t size)