#ifndef UMM_MALLOC_H
#define UMM_MALLOC_H

#ifdef __cplusplus
extern "C" {
#endif

extern unsigned char umm_heap_array[];

#ifndef size_t
typedef unsigned int                size_t;
#endif

/* Start addresses and the size of the heap */
#define UMM_MALLOC_CFG_HEAP_ADDR (umm_heap_array)
#ifdef __DUAL_MIC_RECORDING__
#define UMM_MALLOC_CFG_HEAP_SIZE (10 * 1024)
#else
#define UMM_MALLOC_CFG_HEAP_SIZE 0x1000 // 4K
#endif
/* A couple of macros to make packing structures less compiler dependent */

#define UMM_H_ATTPACKPRE
#define UMM_H_ATTPACKSUF __attribute__((__packed__))

#define UMM_BEST_FIT
#undef  UMM_FIRST_FIT

/*
 * A couple of macros to make it easier to protect the memory allocator
 * in a multitasking system. You should set these macros up to use whatever
 * your system uses for this purpose. You can disable interrupts entirely, or
 * just disable task switching - it's up to you
 *
 * NOTE WELL that these macros MUST be allowed to nest, because umm_free() is
 * called from within umm_malloc()
 */

#define UMM_CRITICAL_ENTRY()    LOCK_UMM_CLOCK()
#define UMM_CRITICAL_EXIT()     UNLOCK_UMM_CLOCK()

/* ------------------------------------------------------------------------ */

void  umm_init( void );
void *umm_malloc( size_t size );
void *umm_calloc( size_t num, size_t size );
void *umm_realloc( void *ptr, size_t size );
void  umm_free( void *ptr );


/* ------------------------------------------------------------------------ */

#ifdef __cplusplus
}
#endif

#endif /* UMM_MALLOC_H */
