/*
 **    Name: rmafree.c
 **
 **    Date: Sun Jan  5 16:32:24 2003
 **
 */

#include "rmamem.h"
#include "osheap.h"
#include "kernel.h"
#include "osmodule.h"
#include <stdlib.h>

void rmafree(void *ptr)
{
    char *new_ptr;

    _kernel_swi_regs regs;

    if (rmamem_status == RMAMEM_UNITIALISED)
    {
        rmamem_init(RMAMEM_UNITIALISED);
    }

    switch (rmamem_status)
    {
        case RMAMEM_DYNAMICAREA:

            if (ptr != NULL)
            {
                regs.r[0] = OSHeap_Free;
                regs.r[1] = rmamem_details.base;
                regs.r[2] = (int)ptr;
                if (_kernel_swi(XOS_Heap,&regs,&regs) == NULL)
                {
                    rmamem_shrink();
                }
            }
            break;

        case RMAMEM_MALLOC:
            free(ptr);
            break;

        case RMAMEM_RMA:

            if (ptr != NULL)
            {
                new_ptr = (char *)ptr;
                new_ptr -= 4;

                regs.r[0] = OSModule_Free;
                regs.r[2] = (int)new_ptr;
                _kernel_swi(XOS_Module,&regs,&regs);

                rmamem_details.count--;
            }
            break;
    }
}
