3. Nibble Memory
Prev | Chapter 7. Supporting Tools | Next

## 3. Nibble Memory

Sometimes when you need to allocate and construct a large, interconnected complex of structures, it can be a bit of a pain to release the associated memory again. For the structures describing the Z39.50 PDUs and related structures, it is convenient to use the memory-management system of the ODR subsystem (see Section 2, “Using ODR”). However, in some circumstances where you might otherwise benefit from using a simple nibble memory management system, it may be impractical to use `odr_malloc()` and `odr_reset()`. For this purpose, the memory manager which also supports the ODR streams is made available in the NMEM module. The external interface to this module is given in the `nmem.h` file.

The following prototypes are given:

        NMEM nmem_create(void);
        void nmem_destroy(NMEM n);
        void *nmem_malloc(NMEM n, size_t size);
        void nmem_reset(NMEM n);
        size_t nmem_total(NMEM n);
        void nmem_init(void);
        void nmem_exit(void);

The `nmem_create()` function returns a pointer to a memory control handle, which can be released again by `nmem_destroy()` when no longer needed. The function `nmem_malloc()` allocates a block of memory of the requested size. A call to `nmem_reset()` or `nmem_destroy()` will release all memory allocated on the handle since it was created (or since the last call to `nmem_reset()`. The function `nmem_total()` returns the number of bytes currently allocated on the handle.

The nibble memory pool is shared amongst threads. POSIX mutex'es and WIN32 Critical sections are introduced to keep the module thread safe. Function `nmem_init()` initializes the nibble memory library and it is called automatically the first time the `YAZ.DLL` is loaded. YAZ uses function `DllMain` to achieve this. You should not call `nmem_init` or `nmem_exit` unless you're absolute sure what you're doing. Note that in previous YAZ versions you'd have to call `nmem_init` yourself.

Prev | Up | Next
2. Object Identifiers | Home | 4. Log