
#include "FreeRTOS.h"
#include "static-allocator.h"
#include <stdlib.h>
#include <stdio.h>
#include "task.h"

void poolInit( static_pool_t* inPool, uint8_t inItemSize, uint8_t inNumItems)
{
    uint8_t *entry_ptr = (uint8_t*)&inPool->pool[0];
    unsigned int i = 0;
    inPool->pool_header.item_size = inItemSize;
    inPool->pool_header.num_items = inPool->pool_header.free_items = inNumItems;
    inPool->pool_header.first_free_item_index = 0;
    // create a list of free entries. Last item points to
    // non-existent iNumItems value, but that's okay
    // because we use free_items to track empty and never
    // use it.
    while (i < inNumItems) {
        *entry_ptr = ++i;
        entry_ptr += inItemSize;
    }
}

void *poolAllocateBuffer( static_pool_t* inPool )
{
    vTaskSuspendAll();

    uint8_t *free_entry = NULL;
    /* take first item off of free list, if any */
    if (inPool->pool_header.free_items == 0) {
        /* pool is empty! */
        configASSERT(pdFALSE);
    } else {
        inPool->pool_header.free_items--;
        free_entry = (uint8_t*)&inPool->pool[0] + (inPool->pool_header.first_free_item_index * inPool->pool_header.item_size);
        inPool->pool_header.first_free_item_index = *free_entry;
    }

    xTaskResumeAll();

    return (void*)free_entry;
}

void poolFreeBuffer( static_pool_t* inPool, void* inPointer)
{
    vTaskSuspendAll();

    uint8_t *free_entry = (uint8_t*)inPointer;

    // check that the object belongs in this pool!
    int entry_index = (free_entry - &inPool->pool[0]) / inPool->pool_header.item_size;
    configASSERT((entry_index >= 0) && (entry_index < inPool->pool_header.num_items));

    inPool->pool_header.free_items++;
    configASSERT(inPool->pool_header.free_items <= inPool->pool_header.num_items);
    /* "point" entry's next at old head */
    *free_entry = inPool->pool_header.first_free_item_index;
    /* "point" head at new entry */
    inPool->pool_header.first_free_item_index = entry_index;

    xTaskResumeAll();
}
