| //---------------------------------------------------------------- |
| // Statically-allocated memory manager |
| // |
| // by Eli Bendersky ([email protected]) |
| // |
| // This code is in the public domain. |
| //---------------------------------------------------------------- |
| #ifndef MEMMGR_H |
| #define MEMMGR_H |
| |
| // |
| // Memory manager: dynamically allocates memory from |
| // a fixed pool that is allocated statically at link-time. |
| // |
| // Usage: after calling memmgr_init() in your |
| // initialization routine, just use memmgr_alloc() instead |
| // of malloc() and memmgr_free() instead of free(). |
| // Naturally, you can use the preprocessor to define |
| // malloc() and free() as aliases to memmgr_alloc() and |
| // memmgr_free(). This way the manager will be a drop-in |
| // replacement for the standard C library allocators, and can |
| // be useful for debugging memory allocation problems and |
| // leaks. |
| // |
| // Preprocessor flags you can define to customize the |
| // memory manager: |
| // |
| // DEBUG_MEMMGR_FATAL |
| // Allow printing out a message when allocations fail |
| // |
| // DEBUG_MEMMGR_SUPPORT_STATS |
| // Allow printing out of stats in function |
| // memmgr_print_stats When this is disabled, |
| // memmgr_print_stats does nothing. |
| // |
| // Note that in production code on an embedded system |
| // you'll probably want to keep those undefined, because |
| // they cause printf to be called. |
| // |
| // POOL_SIZE |
| // Size of the pool for new allocations. This is |
| // effectively the heap size of the application, and can |
| // be changed in accordance with the available memory |
| // resources. |
| // |
| // MIN_POOL_ALLOC_QUANTAS |
| // Internally, the memory manager allocates memory in |
| // quantas roughly the size of two ulong objects. To |
| // minimize pool fragmentation in case of multiple allocations |
| // and deallocations, it is advisable to not allocate |
| // blocks that are too small. |
| // This flag sets the minimal ammount of quantas for |
| // an allocation. If the size of a ulong is 4 and you |
| // set this flag to 16, the minimal size of an allocation |
| // will be 4 * 2 * 16 = 128 bytes |
| // If you have a lot of small allocations, keep this value |
| // low to conserve memory. If you have mostly large |
| // allocations, it is best to make it higher, to avoid |
| // fragmentation. |
| // |
| // Notes: |
| // 1. This memory manager is *not thread safe*. Use it only |
| // for single thread/task applications. |
| // |
| |
| #define DEBUG_MEMMGR_SUPPORT_STATS 1 |
| |
| #define POOL_SIZE 8 * 1024 |
| #define MIN_POOL_ALLOC_QUANTAS 16 |
| |
| |
| typedef unsigned char byte; |
| typedef unsigned long ulong; |
| |
| |
| |
| // Initialize the memory manager. This function should be called |
| // only once in the beginning of the program. |
| // |
| void memmgr_init(); |
| |
| // 'malloc' clone |
| // |
| void* memmgr_alloc(ulong nbytes); |
| |
| // 'free' clone |
| // |
| void memmgr_free(void* ap); |
| |
| // Prints statistics about the current state of the memory |
| // manager |
| // |
| void memmgr_print_stats(); |
| |
| |
| #endif // MEMMGR_H |