/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <allocman/mspace/fixed_pool.h>
#include <allocman/allocman.h>
#include <allocman/util.h>
#include <stdlib.h>

static k_r_malloc_header_t *_morecore(size_t cookie, mspace_k_r_malloc_t *k_r_malloc, size_t new_units)
{
    size_t new_size;
    k_r_malloc_header_t *new_header;
    mspace_fixed_pool_t *fixed_pool = (mspace_fixed_pool_t*)cookie;
    new_size = new_units * sizeof(k_r_malloc_header_t);
    if (new_size > fixed_pool->remaining) {
        return NULL;
    }
    new_header = (k_r_malloc_header_t*)fixed_pool->pool_ptr;
    fixed_pool->pool_ptr += new_size;
    fixed_pool->remaining -= new_size;
    return new_header;
}

void mspace_fixed_pool_create(mspace_fixed_pool_t *fixed_pool, struct mspace_fixed_pool_config config)
{
    size_t padding;
    fixed_pool->pool_ptr = (uintptr_t)config.pool;
    fixed_pool->remaining = config.size;
    padding = fixed_pool->pool_ptr % sizeof(k_r_malloc_header_t);
    fixed_pool->pool_ptr += padding;
    fixed_pool->remaining -= padding;
    mspace_k_r_malloc_init(&fixed_pool->k_r_malloc, (size_t)fixed_pool, _morecore);
}

void *_mspace_fixed_pool_alloc(struct allocman *alloc, void *_fixed_pool, size_t bytes, int *error)
{
    void *ret;
    mspace_fixed_pool_t *fixed_pool = (mspace_fixed_pool_t*)_fixed_pool;
    ret = mspace_k_r_malloc_alloc(&fixed_pool->k_r_malloc, bytes);
    if (ret == NULL) {
        SET_ERROR(error, 1);
    } else {
        SET_ERROR(error, 0);
    }
    return ret;
}

void _mspace_fixed_pool_free(struct allocman *alloc, void *_fixed_pool, void *ptr, size_t bytes)
{
    mspace_fixed_pool_t *fixed_pool = (mspace_fixed_pool_t*)_fixed_pool;
    mspace_k_r_malloc_free(&fixed_pool->k_r_malloc, ptr);
}
