The high-level memory management API consists of C macros and functions called in generated code and/or in application programs to allocate and free memory within the ASN1C run-time.
At the top level are a set of macro definitions that begin with the
prefix
rtxMem
. These are mapped to a set of
similar functions that begin with the prefix
rtxMemHeap
. A table showing this basic
mapping is as follows:
Macro | Function | Description |
---|---|---|
rtxMemAlloc
|
rtxMemHeapAlloc
|
Allocate memory |
rtxMemAllocZ
|
rtxMemHeapAllocZ
|
Allocate and zero memory |
rtxMemRealloc
|
rtxMemHeapRealloc
|
Reallocate memory |
rtxMemFree
|
rtxMemHeapFreeAll
|
Free all memory in context |
rtxMemFreePtr
|
rtxMemHeapFreePtr
|
Free a specific memory block |
See the ASN1C C/C++ Common Runtime Reference Manual for further details on these functions and macros.
It is possible to replace the high-level memory allocation
functions with functions that implement a custom memory management
scheme. This is done by implementing some (or all) of the C
rtxMemHeap
functions defined in the
following interface (note: a default implementation is shown that
replaces the ASN1C memory manager with direct calls to the standard C
run-time memory management functions):
#include <stdlib.h> #include "rtxMemory.h" /* Create a memory heap */ int rtxMemHeapCreate (void **ppvMemHeap) { return 0; } /* Allocate memory */ void* rtxMemHeapAlloc (void **ppvMemHeap, size_t nbytes) { return malloc (nbytes); } /* Allocate and zero memory */ void* rtxMemHeapAllocZ (void **ppvMemHeap, size_t nbytes) { return calloc (nbytes, 1); } /* Free memory pointer */ void rtxMemHeapFreePtr (void **ppvMemHeap, void *mem_p) { free (mem_p); } /* Reallocate memory */ void* rtxMemHeapRealloc (void **ppvMemHeap, void *mem_p, size_t nbytes) { return realloc (mem_p, nbytes); } /* Free heap memory, reset all heap variables. */ void rtxMemHeapFreeAll (void **ppvMemHeap) { /* There is no analog in standard memory management. */ } /* Free heap memory, reset all heap variables, and free heap structure if it was allocated. */ void rtxMemHeapRelease (void **ppvMemHeap) { /* There is no analog in standard memory management. */ }
In most cases it is only necessary to implement the following functions:
rtxMemHeapAlloc
rtxMemHeapAllocZ
rtxMemHeapFreePtr
rtxMemHeapRealloc
There is no analog in standard memory management for ASN1C's
rtxMemFree
macro (i.e. the
rtxMemHeapFreeAll
function). The user is
responsible for freeing all items in a generated ASN1C structure
individually if standard memory management is used.
The
rtxMemHeapCreate
and
rtxMemHeapRelease
functions are
specialized functions used when a special heap is to be used for
allocation (for example, a static block within an embedded system). In
this case,
rtxMemHeapCreate
must set the
ppvMemHeap
argument to point at the block
of memory to be used. This will then be passed in to all of the other
memory management functions for their use through the OSCTXT structure.
The
rtxMemHeapRelease
function can then be
used to dispose of this memory when it is no longer needed.
To add these definitions to an application program, compile the C
source file (it can have any name) and link the resulting object file
(.obj
or
.o
) in with the application.