home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / sdk / mapi / win16 / dev / smpcli / pvalloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-11  |  4.3 KB  |  200 lines

  1. /*
  2.  -  P V A L L O C . C
  3.  -
  4.  *  Purpose:
  5.  *      Implementation of a chained memory manager.
  6.  *
  7.  *  Copyright 1993-1995 Microsoft Corporation. All Rights Reserved.
  8.  */
  9.  
  10. #include <string.h>
  11. #include <windows.h>
  12. #include "pvalloc.h"
  13.  
  14. #ifdef _DEBUG
  15. static CB cbTotalAlloc = 0;
  16. #endif
  17.  
  18. /*
  19.  -  PvAlloc
  20.  -
  21.  *  Purpose:
  22.  *      Allocates a chunk of memory on the global heap.
  23.  *
  24.  *  Parameters:
  25.  *      cbSize          - Count of bytes requested.
  26.  *
  27.  *  Returns:
  28.  *      lpv             - Pointer to the allocated memory
  29.  *
  30.  */
  31.  
  32. PV PvAlloc(CB cbSize)
  33. {
  34.     PV      lpv = pvNull;
  35.     HANDLE  hMem;
  36.     PPVINFO ppvinfo;
  37. #ifdef _DEBUG
  38.     char    szBuff[128];
  39. #endif
  40.  
  41.     /* Make sure allocations are in multiples of 4 */
  42.  
  43.     if(cbSize < 4)
  44.         cbSize = 4;
  45.     else if(cbSize & 3)
  46.         cbSize += 4 - (cbSize & 3);
  47.  
  48.     /* Allocate the block */
  49.  
  50.     hMem = GlobalAlloc(GMEM_MOVEABLE, cbSize + sizeof(PVINFO));
  51.     if(hMem)
  52.     {
  53.         ppvinfo = (PPVINFO)GlobalLock(hMem);
  54.         ppvinfo->hMem    = hMem;
  55.         ppvinfo->lpvNext = pvNull;
  56.         ppvinfo->lpvBuf  = ((PB)ppvinfo) + sizeof(PVINFO);
  57. #ifdef _DEBUG
  58.         ppvinfo->cbSize  = cbSize;
  59.         cbTotalAlloc += cbSize;
  60.         wsprintf(szBuff, "Allocating: %ld Bytes\tTotal: %ld Bytes\r\n",
  61.                  cbSize, cbTotalAlloc);
  62.         OutputDebugString(szBuff);
  63.  
  64. #ifdef WIN32
  65.         memset(ppvinfo->lpvBuf, 0xaa, (size_t)cbSize);
  66. #else
  67.         _fmemset(ppvinfo->lpvBuf, 0xaa, (size_t)cbSize);
  68. #endif  /* WIN32 */
  69.  
  70. #endif  /* _DEBUG */
  71.         lpv = ppvinfo->lpvBuf;
  72.     }
  73.  
  74.     return lpv;
  75. }
  76.  
  77.  
  78.  
  79. /*
  80.  -  PvAllocMore
  81.  -
  82.  *  Purpose:
  83.  *      Allocates a chunk of memory and chains it to a parent block.
  84.  *
  85.  *  Parameters:
  86.  *      cbSize          - Count of additional bytes to allocate
  87.  *      lpvParent       - Pointer to parent in memory chain
  88.  *
  89.  *  Returns:
  90.  *      lpv             - Pointer to the allocated memory
  91.  *
  92.  */
  93.  
  94. PV PvAllocMore(CB cbSize, PV lpvParent)
  95. {
  96.     PV       lpvStep = lpvParent;
  97.     PV       lpv     = pvNull;
  98.     PPVINFO  ppvinfo;
  99.  
  100.     /* Step to the last link */
  101.     do
  102.     {
  103.         ppvinfo = (PPVINFO)(((PB)lpvStep) - sizeof(PVINFO));
  104.         lpvStep = ppvinfo->lpvNext;
  105.     }
  106.     while(ppvinfo->lpvNext != pvNull);
  107.  
  108.     lpv = PvAlloc(cbSize);
  109.  
  110. #ifdef WIN32
  111.         memset(lpv, 0xbb, (size_t)cbSize);
  112. #else
  113.         _fmemset(lpv, 0xbb, (size_t)cbSize);
  114. #endif  /* WIN32 */
  115.  
  116.     ppvinfo->lpvNext = lpv;
  117.  
  118.     return lpv;
  119. }
  120.  
  121.  
  122. /*
  123.  -  PvFree
  124.  -
  125.  *  Purpose:
  126.  *      This function frees memory allocated by PvAlloc or PvAllocMore.
  127.  *      After the call, the pointer memory will be invalid and should
  128.  *      not be referenced again.
  129.  *      When memory is allocated by PvAlloc and PvAllocMore, which can
  130.  *      contain several levels of pointers, all the application needs to
  131.  *      do to free the entire structure is call this routine with the
  132.  *      base pointer returned by the PvAlloc call.
  133.  *
  134.  *  Parameters:
  135.  *      lpv             - Pointer to memory to be freed.
  136.  *
  137.  *  Returns:
  138.  *      Void
  139.  *
  140.  */
  141.  
  142. BOOL PvFree(PV lpv)
  143. {
  144.     PPVINFO ppvinfo;
  145. #ifdef _DEBUG
  146.     char    szBuff[128];
  147.     CB      cbSize;
  148. #endif
  149.  
  150.     if(!lpv)
  151.         return 0;
  152.  
  153.     ppvinfo = (PPVINFO)(((PB)lpv) - sizeof(PVINFO));
  154.  
  155.     while(ppvinfo)
  156.     {
  157.         lpv = ppvinfo->lpvNext;
  158.  
  159. #ifdef _DEBUG
  160.         cbSize = ppvinfo->cbSize;
  161.  
  162. #ifdef WIN32
  163.         memset(ppvinfo->lpvBuf, 0xcc, (size_t)ppvinfo->cbSize);
  164. #else
  165.         _fmemset(ppvinfo->lpvBuf, 0xcc, (size_t)ppvinfo->cbSize);
  166. #endif  /* WIN32 */
  167.  
  168. #endif  /* _DEBUG */
  169.  
  170.         if(GlobalUnlock(ppvinfo->hMem))
  171.             goto err;  // Our lock count is non-zero
  172.  
  173.         if(GlobalFree(ppvinfo->hMem))
  174.             goto err;  // Failure
  175.  
  176. #ifdef _DEBUG
  177.         cbTotalAlloc -= cbSize;
  178.         wsprintf(szBuff, "Freeing: %ld Bytes\tUnFreed: %ld Bytes\r\n",
  179.                  cbSize, cbTotalAlloc);
  180.         OutputDebugString(szBuff);
  181. #endif  /* _DEBUG */
  182.  
  183.         if(lpv)
  184.             ppvinfo = (PPVINFO)(((PB)lpv) - sizeof(PVINFO));
  185.         else
  186.             break;
  187.     }
  188.  
  189.     return 0; // Success!
  190.  
  191. err:
  192. #ifdef _DEBUG
  193.     wsprintf(szBuff, "Failure freeing: %ld Bytes\tUnFreed: %ld Bytes\r\n",
  194.              cbSize, cbTotalAlloc);
  195.     OutputDebugString(szBuff);
  196. #endif  /* _DEBUG */
  197.  
  198.     return 1; // Failure!
  199. }
  200.