예제 #1
0
    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;
 }
예제 #3
0
 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_;
     }
 }