15 #include "neverFreeMemory.h"
16 #include "atomicAdjust.h"
17 #include "memoryHook.h"
23 static const size_t min_page_remaining_size = 16;
26 static const size_t min_page_size = 128 * 1024;
44 void *NeverFreeMemory::
45 ns_alloc(
size_t size) {
53 size = ((size + alignment_size - 1) / alignment_size) * alignment_size;
59 Pages::iterator pi = _pages.lower_bound(Page(NULL, size));
60 if (pi != _pages.end()) {
64 void *result = page.alloc(size);
65 if (page._remaining >= min_page_remaining_size) {
74 size_t needed_size = max(size, min_page_size);
76 void *start = memory_hook->
mmap_alloc(needed_size,
false);
77 _total_alloc += needed_size;
79 Page page(start, needed_size);
80 void *result = page.alloc(size);
81 if (page._remaining >= min_page_remaining_size) {
93 void NeverFreeMemory::
97 ((
void * TVOLATILE &)_global_ptr, (
void *)NULL, (
void *)ptr);
This class is used to allocate bytes of memory from a pool that is never intended to be freed...
size_t round_up_to_page_size(size_t size) const
Rounds the indicated size request up to the next larger multiple of page_size, to qualify it for a ca...
virtual void * mmap_alloc(size_t size, bool allow_exec)
Allocates a raw page or pages of memory directly from the OS.
static Pointer compare_and_exchange_ptr(Pointer &mem, Pointer old_value, Pointer new_value)
Atomic compare and exchange.
static size_t get_memory_alignment()
Returns the global memory alignment.