# Memory block management functions

## Data Structures
struct | memb_blocks
## Files
file | memb.c
file | memb.h
## Defines
#define | MEMB_CONCAT2(s1, s2) s1##s2
#define | MEMB_CONCAT(s1, s2) MEMB_CONCAT2(s1, s2)
#define | MEMB(name, structure, num)
## Functions
void | memb_init (struct memb_blocks *m)
void * | memb_alloc (struct memb_blocks *m)
char | memb_free (struct memb_blocks *m, void *ptr)

## Detailed Description

The memory block allocation routines provide a simple yet powerful set of functions for managing a set of memory blocks of fixed size. A set of memory blocks is statically declared with the MEMB() macro. Memory blocks are allocated from the declared memory by the memb_alloc() function, and are deallocated with the memb_free() function.

Note:
  Because of namespace clashes only one MEMB() can be declared per C module, and the name scope of a MEMB() memory block is local to each C module.

The following example shows how to declare and use a memory block called "cmem" which has 8 chunks of memory with each memory chunk being 20 bytes large.

## Define Documentation

#define MEMB | ( | name,
|  | structure,
|  | num |  | ) |

Value:

    static char MEMB_CONCAT(name,_memb_count)[num]; \
            static structure MEMB_CONCAT(name,_memb_mem)[num]; \
            static struct memb_blocks name = {sizeof(structure), num, \
                                              MEMB_CONCAT(name,_memb_count), \
                                              (void *)MEMB_CONCAT(name,_memb_mem)}

Declare a memory block.

This macro is used to staticall declare a block of memory that can be used by the block allocation functions. The macro statically declares a C array with a size that matches the specified number of blocks and their individual sizes.

Example:

    MEMB(connections, sizeof(struct connection), 16);

Parameters:

  | name | The name of the memory block (later used with memb_init(), memb_alloc() and memb_free()).
  | size | The size of each memory chunk, in bytes.
  | num | The total number of memory chunks in the block.

#define MEMB_CONCAT | ( | s1,
|  | s2 |  | ) | MEMB_CONCAT2(s1, s2)

#define MEMB_CONCAT2 | ( | s1,
|  | s2 |  | ) | s1##s2

## Function Documentation

void * memb_alloc | ( | struct memb_blocks * | m | ) |

Allocate a memory block from a block of memory declared with MEMB().

Parameters:

  | m | A memory block previosly declared with MEMB().

char memb_free | ( | struct memb_blocks * | m,
|  | void * | ptr |
| ) |  |  |

Deallocate a memory block from a memory block previously declared with MEMB().

Parameters:

  | m | m A memory block previosly declared with MEMB().
  | ptr | A pointer to the memory block that is to be deallocated.

Returns:
  The new reference count for the memory block (should be 0 if successfully deallocated) or -1 if the pointer "ptr" did not point to a legal memory block.

void memb_init | ( | struct memb_blocks * | m | ) |

Initialize a memory block that was declared with MEMB().

Parameters:

  | m | A memory block previosly declared with MEMB().