memPartLibP.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* memPartLibP.h - private memory management library header file */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,23oct01,tam  re-organized FREE_BLOCK
  7. 01g,19oct01,tam  added definition for KMEM_XXX macros
  8. 01f,25sep01,tam  added definition of the KHEAP_XXX macros
  9. 01e,19aug96,dbt  removed memPartAlignedAlloc prototype (fixed SPR #6898).
  10. 01e,05aug96,kkk  made padding in BLOCK_HDR generic to all arch with alignment
  11.  at 16.
  12. 01d,22sep92,rrr  added support for c++
  13. 01c,28jul92,jcf  added external declaration for memPartOptionsDefault.
  14. 01b,19jul92,pme  added external declarations for sm partition functions.
  15. 01a,01jul92,jcf  extracted from memLib v3r.
  16. */
  17. #ifndef __INCmemPartLibPh
  18. #define __INCmemPartLibPh
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #include "vwModNum.h"
  23. #include "memLib.h"
  24. #include "classLib.h"
  25. #include "dllLib.h"
  26. #include "private/semLibP.h"
  27. #include "private/objLibP.h"
  28. /* macros for getting to next and previous blocks */
  29. #define NEXT_HDR(pHdr)  ((BLOCK_HDR *) ((char *) (pHdr) + (2 * (pHdr)->nWords)))
  30. #define PREV_HDR(pHdr) ((pHdr)->pPrevHdr)
  31. /* macros for converting between the "block" that caller knows
  32.  * (actual available data area) and the block header in front of it */
  33. #define HDR_TO_BLOCK(pHdr) ((char *) ((int) pHdr + sizeof (BLOCK_HDR)))
  34. #define BLOCK_TO_HDR(pBlock) ((BLOCK_HDR *) ((int) pBlock - 
  35. sizeof(BLOCK_HDR)))
  36. /* macros for converting between the "node" that is strung on the freelist
  37.  * and the block header in front of it */
  38. #define HDR_TO_NODE(pHdr) (& ((FREE_BLOCK *) pHdr)->node)
  39. #define NODE_TO_HDR(pNode) ((BLOCK_HDR *) ((int) pNode - 
  40. OFFSET (FREE_BLOCK, node)))
  41. /*
  42.  * Kernel memory allocation macros (KHEAP and KMEM macros)
  43.  *
  44.  * NOTE: They should not be used by any application code.
  45.  * It is also needed by code being back-ported from VxWorks AE 1.x. to VxWorks
  46.  * 5.5.x.
  47.  */
  48. /*
  49.  * KHEAP macros:
  50.  * These macros are defined simply for cosmetic reasons, to make it more 
  51.  * obvious that buffers are allocated or freed from the kernel heap, also 
  52.  * called the system memory partition.
  53.  * No guaranty is given that the buffer allocated from the Kernel
  54.  * Heap via KHEAP_ALLOC has a known and constant virtual to physical mapping
  55.  * (1 to 1 mapping for instance) if virtual memory support is included (i.e.
  56.  * INCLUDE_MMU_BASIC or INCLUDE_MMU_FULL components).
  57.  *
  58.  * NOTE: KHEAP_ALIGNED_ALLOC() uses memPartAlignedAlloc() instead of memalign()
  59.  *       to prevent any requirements on INCLUDE_MEM_MGR_FULL when using the 
  60.  *  macro KHEAP_ALIGNED_ALLOC.
  61.  */
  62. #define KHEAP_ALLOC(nBytes)                                             
  63.         malloc((nBytes))
  64. #define KHEAP_FREE(pChar)                                               
  65.         free((pChar))
  66. #define KHEAP_ALIGNED_ALLOC(nBytes, alignment)                          
  67.         memPartAlignedAlloc(memSysPartId, (nBytes), (alignment))
  68. #define KHEAP_REALLOC(pChar, newSize)                                    
  69.         memPartRealloc(memSysPartId, (pChar), (newSize))
  70. /*
  71.  * KMEM macros:
  72.  * If a known and constant virtual to physical mapping is required for buffer
  73.  * allocated, KMEM macros should be used instead of KHEAP macros.
  74.  * For instance memory block dynamically allocated that may be accessed when
  75.  * the processor MMU is turn off or on should always be allocated using 
  76.  * KMEM_ALLOC() or KMEM_ALIGNED_ALLOC(). Good examples are memory blocks used 
  77.  * to store MMU translation information on some processor, or memory blocks
  78.  * accessed by DMA devices.
  79.  * Good care should be taken before using KMEM macros. If no constant virtual 
  80.  * to physical mapping is required, then KHEAP macros should always be used 
  81.  * instead.
  82.  *
  83.  * NOTE: With VxWorks 5.5.x, there's no differences between KHEAP_XXX and 
  84.  * KMEM_XXX macros. However this will change in future releases.
  85.  */
  86. #define KMEM_ALLOC(nBytes)      
  87. memPartAlloc(memSysPartId, (nBytes))
  88. #define KMEM_FREE(pChar)
  89. memPartFree(memSysPartId, (pChar))
  90. #define KMEM_ALIGNED_ALLOC(nBytes, alignment)
  91.         memPartAlignedAlloc(memSysPartId, (nBytes), (alignment))
  92. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  93. #pragma align 1 /* tell gcc960 not to optimize alignments */
  94. #endif /* CPU_FAMILY==I960 */
  95. /* typedefs */
  96. typedef struct mem_part
  97.     {
  98.     OBJ_CORE objCore; /* object management */
  99.     DL_LIST freeList; /* list of free blocks */
  100.     SEMAPHORE sem; /* partition semaphore */
  101.     unsigned totalWords; /* total number of words in pool */
  102.     unsigned minBlockWords; /* min blk size in words includes hdr */
  103.     unsigned options; /* options */
  104.     /* allocation statistics */
  105.     unsigned curBlocksAllocated; /* current # of blocks allocated */
  106.     unsigned curWordsAllocated; /* current # of words allocated */
  107.     unsigned cumBlocksAllocated; /* cumulative # of blocks allocated */
  108.     unsigned cumWordsAllocated; /* cumulative # of words allocated */
  109.     } PARTITION;
  110. /* 
  111.  * Allocated block header. 
  112.  * NOTE: The size of this data structure must be aligned on _ALLOC_ALIGN_SIZE.
  113.  */
  114. typedef struct blockHdr /* BLOCK_HDR */
  115.     {
  116.     struct blockHdr * pPrevHdr; /* pointer to previous block hdr */
  117.     unsigned nWords : 31; /* size in words of this block */
  118.     unsigned free   : 1; /* TRUE = this block is free */
  119. #if (_ALLOC_ALIGN_SIZE == 16)
  120.     UINT32 pad[2]; /* 8 byte pad for round up */
  121. #endif /* _ALLOC_ALIGN_SIZE == 16 */
  122.     } BLOCK_HDR;
  123. /* 
  124.  * Free block header. 
  125.  * NOTE: The size of this data structure is already aligned on 
  126.  * _ALLOC_ALIGN_SIZE, for 4, 8, and 16 bytes alignments.
  127.  */
  128. typedef struct /* FREE_BLOCK */
  129.     {
  130.     struct
  131.         {
  132. struct blockHdr *   pPrevHdr; /* pointer to previous block hdr */
  133. unsigned     nWords : 31;/* size in words of this block */
  134. unsigned     free   : 1; /* TRUE = this block is free */
  135. } hdr;
  136.     DL_NODE node; /* freelist links */
  137.     } FREE_BLOCK;
  138. /* variable declarations */
  139. extern CLASS_ID memPartClassId; /* memory partition class id */
  140. extern FUNCPTR  memPartBlockErrorRtn; /* block error method */
  141. extern FUNCPTR  memPartAllocErrorRtn; /* alloc error method */
  142. extern FUNCPTR  memPartSemInitRtn; /* partition semaphore init method */
  143. extern unsigned memPartOptionsDefault; /* default partition options */
  144. extern UINT memDefaultAlignment; /* default alignment */
  145. extern int mutexOptionsMemLib; /* mutex options */
  146. /* shared memory manager function pointers */
  147. extern FUNCPTR  smMemPartAddToPoolRtn;
  148. extern FUNCPTR  smMemPartFreeRtn;
  149. extern FUNCPTR  smMemPartAllocRtn;
  150. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  151. #pragma align 0 /* turn off alignment requirement */
  152. #endif /* CPU_FAMILY==I960 */
  153. /* function declarations */
  154. #if defined(__STDC__) || defined(__cplusplus)
  155. extern BOOL memPartBlockIsValid (PART_ID partId, BLOCK_HDR *pHdr,
  156.      BOOL isFree);
  157. #else /* __STDC__ */
  158. extern BOOL memPartBlockIsValid ();
  159. #endif /* __STDC__ */
  160. #ifdef __cplusplus
  161. }
  162. #endif
  163. #endif /* __INCmemPartLibPh */