| 331 | } |
| 332 | |
| 333 | void* |
| 334 | MemoryPool::pool_alloc(size_t size) |
| 335 | { |
| 336 | #if defined(WITH_VALGRIND) |
| 337 | VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(pool_ptr_, pool_size_); |
| 338 | #endif |
| 339 | |
| 340 | // Pointer to return |
| 341 | unsigned char* block = NULL; |
| 342 | |
| 343 | // Round up to 8-byte boundary |
| 344 | size_t aligned_size = align(size, granularity_); |
| 345 | |
| 346 | if (aligned_size < min_alloc_size_) { |
| 347 | aligned_size = min_alloc_size_; |
| 348 | } |
| 349 | |
| 350 | // The block to allocate from |
| 351 | FreeHeader* block_to_alloc = free_index_.find(aligned_size, pool_ptr_); |
| 352 | |
| 353 | if (block_to_alloc) { |
| 354 | block = allocate(block_to_alloc, aligned_size); |
| 355 | } |
| 356 | |
| 357 | // Update lwm |
| 358 | size_t largest_free_bytes = largest_free_ ? largest_free_->size() : 0; |
| 359 | if (largest_free_bytes < lwm_free_bytes_) { |
| 360 | lwm_free_bytes_ = largest_free_bytes; |
| 361 | } |
| 362 | |
| 363 | #ifdef VALIDATE_MEMORY_POOL |
| 364 | validate_pool(*this, false); |
| 365 | #endif |
| 366 | |
| 367 | #if defined(WITH_VALGRIND) |
| 368 | VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(pool_ptr_, pool_size_); |
| 369 | VALGRIND_MEMPOOL_ALLOC(pool_ptr_, block, size); |
| 370 | #endif |
| 371 | |
| 372 | return block; |
| 373 | } |
| 374 | |
| 375 | bool |
| 376 | MemoryPool::pool_free(void* ptr) |