### Example (_uaddmem -- Add Memory to a Heap)

The following example creates a heap myheap, and then uses _uaddmem to add memory to it.

    #if  (1 == __TOS_OS2__)                /*  For OS/2  */
       #define  INCL_DOSMEMMGR             /* Memory Manager values */
       #include <os2.h>
       #include <bsememf.h>                /* Get flags for memory management  */
    #else
       #include <windows.h>                /*  For Windows  */
    #endif

    #include <stdlib.h>
    #include <stdio.h>
    #include <umalloc.h>

    int main(void)
    {
       void    *initial_block, *extra_chunk;
       Heap_t  myheap;
       char    *p1, *p2;

    #if  (1 == __TOS_OS2__)
       APIRET  rc;

       /* Call DosAllocMem to get the initial block of memory */
       if (0 != (rc = DosAllocMem(&initial_block, 65536,
                                  PAG_WRITE | PAG_READ | PAG_COMMIT)))
       {
          printf("DosAllocMem for initial block failed: return code = %ld\n", rc);

    #else
       /* Call VirtualAlloc to get the initial block of memory */
       if (NULL == (initial_block =
           VirtualAlloc(NULL, 65536, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE)))
       {
          printf("VirtualAlloc for initial block failed: %d.\n", GetLastError());

    #endif
          exit(EXIT_FAILURE);
       }
       /* Create a fixed size heap starting with the block declared earlier */
       if (NULL == (myheap = _ucreate(initial_block, 65536, _BLOCK_CLEAN,
                                      _HEAP_REGULAR, NULL, NULL))) {
          puts("_ucreate failed.");
          exit(EXIT_FAILURE);
       }
       if (0 != _uopen(myheap)) {
          puts("_uopen failed.");
          exit(EXIT_FAILURE);
       }
       p1 = (char*)_umalloc(myheap, 100);
    #if  (1 == __TOS_OS2__)
       /* Call DosAllocMem to get another block of memory */
       if (0 != (rc = DosAllocMem(&extra_chunk, 10 * 65536,
                                  PAG_WRITE | PAG_READ | PAG_COMMIT)))
       {
          printf("DosAllocMem for extra chunk failed: return code = %ld\n", rc);

    #else
       /* Call VirtualAlloc to get another block of memory */
       if (NULL == (extra_chunk =
           VirtualAlloc(NULL, 10 * 65536, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE)))
       {
          printf("VirtualAlloc for extra chunk failed: %d.\n", GetLastError());

    #endif
          exit(EXIT_FAILURE);
       }
       /* Add the second chunk of memory to user heap */
       if (myheap != _uaddmem(myheap, extra_chunk, 10 * 65536, _BLOCK_CLEAN)) {
          puts("_uaddmem failed.");
          exit(EXIT_FAILURE);
       }
       p2 = (char*)_umalloc(myheap, 100000);
       free(p1);
       free(p2);
       if (0 != _uclose(myheap)) {
          puts("_uclose failed");
          exit(EXIT_FAILURE);
       }
    #if  (1 == __TOS_OS2__)
       if (0 != DosFreeMem(initial_block) || 0 != DosFreeMem(extra_chunk))
       {
          puts("DosFreeMem error.");

    #else
       if (FALSE == VirtualFree(initial_block, 0, MEM_RELEASE) ||
           FALSE == VirtualFree(extra_chunk, 0, MEM_RELEASE))
       {
          puts("VirtualFree error.");

    #endif
          exit(EXIT_FAILURE);
       }
       return 0;
    }