bool deallocate(U* t_ptr, size_t size) { size_t size_bytes = size*sizeof(U); char *ptr = (char*)t_ptr; if (_pos != size_t(ptr-_mem)+size_bytes) throw std::runtime_error("attempting to free memory which is not at the top of the stack"); if (ptr_size(ptr) != size) throw std::runtime_error("attempting to free memory of wrong size"); _pos = prev_pos(ptr); return _pos > 0; }
/** * @brief Reallocate memory previously allocated via heap_caps_(m/c/r/z)alloc(). */ void *_heap_caps_realloc(void *mem, size_t newsize, uint32_t caps, const char *file, size_t line) { void *return_addr = (void *)__builtin_return_address(0); void *p = _heap_caps_malloc(newsize, caps, file, line); if (p && mem) { size_t mem_size = ptr_size(mem); size_t min = MIN(newsize, mem_size); memcpy(p, mem, min); _heap_caps_free(mem, (char *)return_addr, line); } return p; }
U* allocate(size_t size, size_t align = alignof(U)) { align = std::min(align, alignof(size_t)); size_t size_bytes = size*sizeof(U); char* ptr = align_to(_mem+_pos+2*sizeof(size_t), align); if (ptr+size_bytes > _mem+_size) return nullptr; prev_pos(ptr) = _pos; ptr_size(ptr) = size; _pos = size_t(ptr-_mem)+size_bytes; return (U*)ptr; }