Пример #1
0
                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;
                }
Пример #2
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;
}
Пример #3
0
                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;
                }