5 #define __STDC_FORMAT_MACROS
25 const int32_t block_size) {
32 if (p->
size >= block_size) {
36 if (p == head_avail_) {
61 char prior_tag = *(
reinterpret_cast<char *
>(block_ctl) - 1);
62 assert((prior_tag == kTagAvail) || (prior_tag == kTagReserved));
64 int32_t new_size = block_ctl->
size();
68 if (prior_tag == kTagAvail) {
71 reinterpret_cast<char *
>(block_ctl)
75 new_size += prior_size;
77 reinterpret_cast<char *
>(block_ctl) - prior_size);
79 UnlinkAvailBlock(new_avail);
80 if (rover_ == new_avail)
84 int32_t succ_size = *
reinterpret_cast<int32_t *
>(
85 reinterpret_cast<char *
>(new_avail) + new_size);
89 reinterpret_cast<char *
>(new_avail) + new_size);
90 UnlinkAvailBlock(succ_avail);
91 new_size += succ_size;
92 if (rover_ == succ_avail)
97 new_avail->
size = new_size;
98 new (AvailBlockTag::GetTagLocation(new_avail))
AvailBlockTag(new_size);
100 EnqueueAvailBlock(new_avail);
112 block->
link_next = head_avail_->ConvertToLink(arena_);
144 if (total_size < kMinBlockSize)
145 total_size = kMinBlockSize;
152 return ReserveBlock(p, total_size);
163 : arena_(reinterpret_cast<char *>(sxmmap_align(arena_size)))
164 , head_avail_(reinterpret_cast<
AvailBlockCtl *>(arena_ + sizeof(uint64_t)))
165 , rover_(head_avail_)
167 , arena_size_(arena_size) {
172 const unsigned char padding = 7;
176 + 1 +
sizeof(int32_t));
177 assert((usable_size % 8) == 0);
187 free_block->
size = usable_size;
197 *(
reinterpret_cast<char *
>(free_block) - 1) =
kTagReserved;
208 unsigned char pattern) {
215 int usable_size = free_block->
size
218 memset(free_block + 1, pattern, usable_size);
234 int32_t remaining_size = block->
size - block_size;
237 block_size += remaining_size;
242 if (remaining_size == 0) {
250 char *new_block =
reinterpret_cast<char *
>(block) + remaining_size;
MallocArena(unsigned arena_size)
AvailBlockCtl * FindAvailBlock(const int32_t block_size)
void ShrinkTo(int32_t smaller_size)
static void * GetTagLocation(AvailBlockCtl *block)
assert((mem||(size==0))&&"Out Of Memory")
void UnlinkAvailBlock(AvailBlockCtl *block)
int32_t ConvertToLink(char *base)
static const int kMinBlockSize
void * ReserveBlock(AvailBlockCtl *block, int32_t block_size)
AvailBlockCtl * GetNextPtr(char *base)
void EnqueueAvailBlock(AvailBlockCtl *block)
static const char kTagReserved
static MallocArena * CreateInitialized(unsigned arena_size, unsigned char pattern)
AvailBlockCtl * head_avail_
static uint64_t RoundUp8(const uint64_t size)
AvailBlockCtl * GetPrevPtr(char *base)
void * Malloc(const uint32_t size)
char * arena_
The memory block.
uint32_t GetSize(void *ptr) const