bufLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* bufLib.c - allocate/free a collection of fixed size memory buffers */
  2. /* Copyright 1984-1995 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,04may95,ms  written.
  7. */
  8. /*
  9. DESCPRIPTION
  10. This library contains routines to allocate and free a collection
  11. of fixed size memory buffers.
  12. It provides an alternative memory allocation scheme to the one provided
  13. in memPartLib.
  14. bufLib has several advantages over memPartLib:
  15.    1) It is an order of magnitude faster than memPartLib.
  16.    2) It can be used at interrupt time.
  17.    3) There is no per-buffer bookkeeping overhead.
  18.    4) There is no memory fragmentation.
  19. bufLib has several disadvantages compared with memPartLib:
  20.    1) It only handles fixed size blocks of memory.
  21.    2) The blocks it handles must be at least eight bytes (2*sizeof(void *)).
  22. A memory buffer object is initialized with
  23.     BUF_POOL bufPool;
  24.     bufPoolInit (&bufPool, pBufs, bufSize, numBufs);
  25. Memory is then allocated/freed with
  26.     pBuf = bufAlloc (pBufPool);
  27.     bufFree  (pBufPool, pData);
  28. */
  29. #define FREE_MAGIC 0x753a012b
  30. #define ALLOC_MAGIC 0x2e63d498
  31. typedef struct
  32.     {
  33.     char * next; /* next free buffer */
  34.     int type; /* FREE_MAGIC or ALLOC_MAGIC */
  35.     } BUFFER;
  36. /* includes */
  37. #include "vxWorks.h"
  38. #include "intLib.h"
  39. #include "bufLib.h"
  40. #if DEBUG
  41. extern logMsg();
  42. /******************************************************************************
  43. *
  44. * bufPoolShow - only used for debugging. XXX - remove.
  45. */ 
  46. void bufPoolShow (BUF_POOL * pBufPool)
  47.     {
  48.     char * pBuf;
  49.     int ix;
  50.     logMsg ("pBufs = 0x%x, numBufs = %d, bufSize = %dn",
  51. pBufPool->pBufs, pBufPool->numBufs, pBufPool->bufSize);
  52.     for (ix = 0; ix < pBufPool->numBufs; ix++)
  53. {
  54. pBuf = pBufPool->pBufs + ix * pBufPool->bufSize;
  55. logMsg ("0x%x %sn", (int)pBuf,
  56. ((BUFFER *)pBuf)->type == FREE_MAGIC ? "Free" : "Allocated");
  57. }
  58.     logMsg ("n");
  59.     }
  60. #endif
  61. /******************************************************************************
  62. *
  63. * bufPoolInit - initialize a buffer pool
  64. *
  65. * bufLib manages I/O buffers for the WDB agent. Since the agent
  66. * can't use malloc(), the buffers are installed at library init time.
  67. * Currently, the agent uses mbufs.
  68. */ 
  69. void bufPoolInit
  70.     (
  71.     BUF_POOL * pBufPool, /* buffer pool to initialize */
  72.     char * pBufs, /* array of buffers to use */
  73.     int numBufs, /* number of bufs in the array */
  74.     int bufSize /* size of each buffer */
  75.     )
  76.     {
  77.     int ix;
  78.     pBufPool->pBufs = pBufs;
  79.     pBufPool->numBufs = numBufs;
  80.     pBufPool->bufSize = bufSize;
  81.     pBufPool->pFreeBufs = pBufs;
  82.     for (ix = 0; ix < numBufs - 1; ix++)
  83. {
  84.         ((BUFFER *)(pBufs + bufSize*ix))->next = pBufs + bufSize * (ix + 1);
  85. ((BUFFER *)(pBufs + bufSize*ix))->type = FREE_MAGIC;
  86. }
  87.     ((BUFFER *)(pBufs + bufSize*ix))->next = NULL;
  88.     ((BUFFER *)(pBufs + bufSize*ix))->type = FREE_MAGIC;
  89.     }
  90. /******************************************************************************
  91. *
  92. * bufAlloc - allocate a buffer.
  93. *
  94. * RETURNS: a char *, or NULL if none are available.
  95. */ 
  96. char * bufAlloc
  97.     (
  98.     BUF_POOL * pBufPool /* buffer pool from which to alloc */
  99.     )
  100.     {
  101.     int  lockKey;
  102.     char * pThisBuf;
  103.     lockKey = intLock ();
  104.     if (pBufPool->pFreeBufs == NULL)
  105. {
  106. intUnlock (lockKey);
  107. return (NULL);
  108. }
  109.     pThisBuf = pBufPool->pFreeBufs;
  110.     pBufPool->pFreeBufs = ((BUFFER *)pBufPool->pFreeBufs)->next;
  111.     ((BUFFER *)pThisBuf)->type = ALLOC_MAGIC;
  112.     ((BUFFER *)pThisBuf)->next = NULL;
  113.     intUnlock (lockKey);
  114.     return (pThisBuf);
  115.     }
  116. /******************************************************************************
  117. *
  118. * bufFree - return a buffer to the buffer pool.
  119. */ 
  120. void bufFree
  121.     (
  122.     BUF_POOL * pBufPool, /* buffer pool to which we free */
  123.     char * pBuf /* buffer to free */
  124.     )
  125.     {
  126.     int lockKey;
  127.     lockKey = intLock();
  128.     /* valid buffer? */
  129.     if ((((BUFFER *)pBuf)->type == FREE_MAGIC) ||
  130. ((unsigned int)pBuf < (unsigned int)pBufPool->pBufs) ||
  131. ((unsigned int)pBuf >= (unsigned int)pBufPool->pBufs +
  132. pBufPool->bufSize * pBufPool->numBufs) ||
  133. (((unsigned int)pBuf - (unsigned int)pBufPool->pBufs)
  134. % pBufPool->bufSize != 0))
  135. {
  136. intUnlock (lockKey);
  137. return;
  138. }
  139.     ((BUFFER *)pBuf)->next = pBufPool->pFreeBufs;
  140.     pBufPool->pFreeBufs = pBuf;
  141.     ((BUFFER *)pBuf)->type = FREE_MAGIC;
  142.     intUnlock (lockKey);
  143.     }