Thursday, May 25, 2017

The Memory Handle API - Making memory handling more efficient

Are dynamic memory allocation and the freeing of memory inefficient on your small device?  The OSS’ Memory Handle API can provide you with more efficient allocation and freeing of memory.  You can create a "memory handle" which is a linked list of large memory blocks, and allow the memory allocation function to allocate small segments of these memory blocks as needed, rather than inefficiently calling dynamic memory allocation functions (such as malloc() and free()) each time you need to allocate or release memory.  This is especially useful when the message you are decoding contains a large number of output memory fragments.  Rather than calling malloc() for each fragment, each decoder request for memory will be satisfied by a small segment of memory from the large blocks in the "memory handle", thus avoiding costly calls to malloc() for dynamic memory allocation.

When it is time to free the memory allocated for the complex structure that you decoded, you can either "release" those pieces of memory individually so that they can be reused by future requests for memory, or you can release or free all of blocks of memory for a particular "memory handle" in a single function call, thereby not needing to traverse the complex message structure to make sure each individual memory fragment is released.  This means that when you have several decode operations, you can simply release all memory between decode operations rather than freeing it, thus being able to reuse this memory for your next decode.

Using OSS’ Memory Handle API, you can also create different "pools" of memory which can be used for different purposes.  A simple function call can set which memory pool is currently active. This can be particularly useful in a multithreaded environment where you may have a different memory pool for messages which will only be handled by the current thread vs. a memory pool for messages which could be passed to other threads.

If you need further control over memory allocation and freeing, you can even replace the default system functions (malloc and free) with your own versions of these functions.

If your platform does not allow dynamic memory allocation, you can still use OSS’ Memory Handle API to use static memory as the "pool" from which fragments of memory are given to the encoder or decoder.

More information about OSS’ Memory Handle API can be found in the OSS ASN.1/C Product Documentation.