void* alloc_new_chunk(size_t size, size_t alignment) { size_t offset = alignment - 1; size_t adjust_size = offset + size; head_t* p = alloc_head(HeadSize + adjust_size); if (p == nullptr) return nullptr; head_t* list = chain(); if (adjust_size > BufferSize && list != nullptr) { p->next_ = list->next_; list->next_ = p; char* head = reinterpret_cast<char*>(p + 1); char* tail = adjust_alignment(head + p->free_ - size, offset); p->free_ = tail - head; return tail; } else { p->next_ = list; head_ = reinterpret_cast<char*>(p + 1); tail_ = adjust_alignment(head_ + p->free_ - size, offset); p->free_ = remain(); return tail_; } }
void* StackAllocator::alloc(const int64_t size) { int err = OB_SUCCESS; void* p = NULL; if (size <= 0) { err = OB_INVALID_ARGUMENT; TBSYS_LOG(ERROR, "alloc(size=%ld): INVALID_ARGUMENT", size); } else if (head_->remain() < size && OB_SUCCESS != (err = alloc_head(size))) { TBSYS_LOG(ERROR, "alloc_block(size=%ld)=>%d", size, err); } else { p = (char*)head_ + head_->pos_; head_->pos_ += size; top_ += size; } return p; }
void* alloc_new_chunk(size_t size) { head_t* p = alloc_head(HeadSize + size); if (p == nullptr) return nullptr; head_t* list = chain(); if (size > BufferSize && list != nullptr) { p->next_ = list->next_; list->next_ = p; char* head = reinterpret_cast<char*>(p + 1); char* tail = head + p->free_ - size; p->free_ = tail - head; return tail; } else { p->next_ = list; head_ = reinterpret_cast<char*>(p + 1); tail_ = head_ + p->free_ - size; p->free_ = remain(); return tail_; } }