# Memory block management functions

## 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.

## Files

file | memb.c
| Memory block allocation routines.

file | memb.h
| Memory block allocation routines.

## Data Structures

struct | memb_blocks

## Defines

#define | MEMB_CONCAT2(s1, s2) s1##s2
#define | MEMB_CONCAT(s1, s2) MEMB_CONCAT2(s1, s2)
#define | MEMB(name, structure, num)
| Declare a memory block.

## Functions

void | memb_init (struct memb_blocks *m)
| Initialize a memory block that was declared with MEMB().
void * | memb_alloc (struct memb_blocks *m)
| Allocate a memory block from a block of memory declared with MEMB().
char | memb_free (struct memb_blocks *m, void *ptr)
| Deallocate a memory block from a memory block previously declared with MEMB().

## 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.

Examples:
  telnetd.c.

Definition at line 98 of file memb.h.

## 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().

Examples:
  telnetd.c.

Definition at line 59 of file memb.c.

References memb_blocks::count, memb_blocks::mem, memb_blocks::num, and memb_blocks::size.

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.

Examples:
  telnetd.c.

Definition at line 79 of file memb.c.

References memb_blocks::count, memb_blocks::mem, and memb_blocks::size.

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().

Examples:
  telnetd.c.

Definition at line 52 of file memb.c.

References memb_blocks::count, memb_blocks::mem, memb_blocks::num, and memb_blocks::size.