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

VxWorks

开发平台:

C/C++

  1. /* memShow.c - memory show routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01t,06oct01,tam  fixed sign and formatting
  8. 01s,05oct01,gls  moved printf in memPartInfoGet() to after semGive (SPR #20102)
  9. 01r,26sep01,jws  move vxMP smMemPartShowRtn ptr to funcBind.c (SPR36055)
  10. 01q,17mar99,jdi  doc: updated w/ info about proj facility (SPR 25727).
  11. 01p,21feb99,jdi  doc: listed errnos.
  12. 01o,17dec97,yp   (SPR #20054) memPartInfoGet now releases partId semaphore if 
  13.  memPartBlockIsValid fails
  14. 01n,10oct95,jdi  doc: added .tG Shell to SEE ALSOs;
  15.  fixed typo in memPartInfoGet().
  16. 01m,28mar95,ms  memPartAvailable is now static, and doesn't call semTake().
  17. 01l,18jan95,jdi  doc cleanup for memPartInfoGet().
  18. 01k,01dec93,jag  added function memPartInfoGet.
  19. 01j,20jan94,jmm  memPartAvailable() now gives the semaphore on error (spr 2908)
  20. 01i,13sep93,jmm  fixed calll to memPartBlockIsValid() from memPartAvailable ()
  21. 01h,30aug93,jmm  added memPartAvailable, changed memPartShow to use it
  22. 01g,02feb93,jdi  doctweak (INCLUDE_SHOW_RTNS to ...ROUTINES).
  23. 01f,22jan93,jdi  documentation cleanup for 5.1.
  24. 01e,13nov92,dnw  added include of smObjLib.h
  25. 01d,02oct92,jdi  documentation cleanup.
  26. 01c,29jul92,pme  added NULL function pointer check for smObj routines.
  27.                  moved OBJ_VERIFY before first printf in memPartShow.
  28. 01b,19jul92,pme  added shared memory management support.
  29. 01a,01jul92,jcf  extracted from memLib.c.
  30. */
  31. /*
  32. DESCRIPTION
  33. This library contains memory partition information display routines.
  34. To use this facility, it must first be installed using memShowInit(),
  35. which is called automatically when the memory partition show facility
  36. is configured into VxWorks using either of the following methods:
  37. .iP
  38. If you use the configuration header files, define
  39. INCLUDE_SHOW_ROUTINES in config.h.
  40. .iP
  41. If you use the Tornado project facility, select INCLUDE_MEM_SHOW.
  42. .LP
  43. SEE ALSO: memLib, memPartLib,
  44. .pG "Target Shell,"
  45. windsh,
  46. .tG "Shell"
  47. */
  48. #include "vxWorks.h"
  49. #include "semLib.h"
  50. #include "dllLib.h"
  51. #include "stdlib.h"
  52. #include "stdio.h"
  53. #include "string.h"
  54. #include "errno.h"
  55. #include "smObjLib.h"
  56. #include "private/memPartLibP.h"
  57. #include "private/smMemLibP.h"
  58. /* globals */
  59. /* forward declarations */
  60. static size_t memPartAvailable (PART_ID partId, size_t * largestBlock,
  61. BOOL printEach);
  62.  
  63. /******************************************************************************
  64. *
  65. * memShowInit - initialize the memory partition show facility
  66. *
  67. * This routine links the memory partition show facility into the VxWorks system.
  68. * These routines are included automatically when this show facility is
  69. * configured into VxWorks using either of the following methods:
  70. * .iP
  71. * If you use the configuration header files, define
  72. * INCLUDE_SHOW_ROUTINES in config.h.
  73. * .iP
  74. * If you use the Tornado project facility, select INCLUDE_MEM_SHOW.
  75. *
  76. * RETURNS: N/A
  77. */
  78. void memShowInit (void)
  79.     {
  80.     classShowConnect (memPartClassId, (FUNCPTR)memPartShow);
  81.     }
  82. /*******************************************************************************
  83. *
  84. * memShow - show system memory partition blocks and statistics
  85. *
  86. * This routine displays statistics about the available and allocated memory
  87. * in the system memory partition.  It shows the number of bytes, the number
  88. * of blocks, and the average block size in both free and allocated memory,
  89. * and also the maximum block size of free memory.  It also shows the number
  90. * of blocks currently allocated and the average allocated block size.
  91. *
  92. * In addition, if <type> is 1, the routine displays a list of all the blocks in
  93. * the free list of the system partition.
  94. *
  95. * EXAMPLE
  96. * .CS
  97. *     -> memShow 1
  98. *
  99. *     FREE LIST:
  100. *       num     addr      size
  101. *       --- ---------- ----------
  102. *         1   0x3fee18         16
  103. *         2   0x3b1434         20
  104. *         3    0x4d188    2909400
  105. *     SUMMARY:
  106. *      status   bytes    blocks   avg block  max block
  107. *      ------ --------- -------- ---------- ----------
  108. *     current
  109. *        free   2909436        3     969812   2909400
  110. *       alloc    969060    16102         60        -
  111. *     cumulative
  112. *       alloc   1143340    16365         69        -
  113. * .CE
  114. *
  115. * RETURNS: N/A
  116. *
  117. * SEE ALSO: memPartShow(),
  118. * .pG "Target Shell,"
  119. * windsh,
  120. * .tG "Shell"
  121. */
  122. void memShow 
  123.     (
  124.     int type  /* 1 = list all blocks in the free list */
  125.     )
  126.     {
  127.     memPartShow (memSysPartId, type);
  128.     }
  129. /*******************************************************************************
  130. *
  131. * memPartShow - show partition blocks and statistics
  132. *
  133. * This routine displays statistics about the available and allocated memory
  134. * in a specified memory partition.  It shows the number of bytes, the number
  135. * of blocks, and the average block size in both free and allocated memory,
  136. * and also the maximum block size of free memory.  It also shows the number
  137. * of blocks currently allocated and the average allocated block size.
  138. *
  139. * In addition, if <type> is 1, the routine displays a list of all the blocks
  140. * in the free list of the specified partition.
  141. *
  142. * RETURNS: OK or ERROR.
  143. *
  144. * ERRNO: S_smObjLib_NOT_INITIALIZED
  145. *
  146. * SEE ALSO: memShow(),
  147. * .pG "Target Shell,"
  148. * windsh,
  149. * .tG "Shell"
  150. */
  151. STATUS memPartShow 
  152.     (
  153.     PART_ID partId, /* partition ID                          */
  154.     int  type /* 0 = statistics, 1 = statistics & list */
  155.     )
  156.     {
  157.     int numBlocks;
  158.     unsigned totalBytes = 0;
  159.     unsigned biggestWords = 0;
  160.     if (partId == NULL)
  161. {
  162. printf ("No partId specified.n");
  163. return (ERROR);
  164. }
  165.     if (ID_IS_SHARED (partId))  /* partition is shared? */
  166. {
  167. if (smMemPartShowRtn == NULL)
  168.     {
  169.     errno = S_smObjLib_NOT_INITIALIZED;
  170.     return (ERROR);
  171.     }
  172.         return ((STATUS) (*smMemPartShowRtn)(SM_OBJ_ID_TO_ADRS (partId), type));
  173. }
  174.     /* partition is local */
  175.     if (OBJ_VERIFY (partId, memPartClassId) != OK)
  176. return (ERROR);
  177.     /* print out list header if we are going to print list */
  178.     if (type == 1)
  179. {
  180. printf ("nFREE LIST:n");
  181. printf ("   num    addr       sizen");
  182. printf ("  ---- ---------- ----------n");
  183. }
  184.     semTake (&partId->sem, WAIT_FOREVER);
  185.     if ((totalBytes = memPartAvailable (partId, &biggestWords, type)) == ERROR)
  186. {
  187. semGive (&partId->sem);
  188.         return (ERROR);
  189. }
  190.     else
  191.         biggestWords /= 2; /* memPartAvailable returns bytes, not words */
  192.     
  193.     if (type == 1)
  194. printf ("nn");
  195.     numBlocks = dllCount (&partId->freeList);
  196.     if (type == 1)
  197. printf ("SUMMARY:n");
  198.     printf (" status    bytes     blocks   avg block  max blockn");
  199.     printf (" ------ ---------- --------- ---------- ----------n");
  200.     printf ("currentn");
  201.     if (numBlocks != 0)
  202. printf ("   free %10u %9u %10u %10un", totalBytes, numBlocks,
  203. totalBytes / numBlocks, 2 * biggestWords);
  204.     else
  205. printf ("   no free blocksn");
  206.     if (partId->curBlocksAllocated != 0)
  207. printf ("  alloc %10u %9u %10u          -n",
  208. 2 * partId->curWordsAllocated, partId->curBlocksAllocated,
  209.         (2 * partId->curWordsAllocated) / partId->curBlocksAllocated);
  210.     else
  211. printf ("   no allocated blocksn");
  212.     printf ("cumulativen");
  213.     if (partId->cumBlocksAllocated != 0)
  214. printf ("  alloc %10u %9u %10u          -n",
  215. 2 * partId->cumWordsAllocated, partId->cumBlocksAllocated,
  216. (2 * partId->cumWordsAllocated) / partId->cumBlocksAllocated);
  217.     else
  218. printf ("   no allocated blocksn");
  219.     semGive (&partId->sem);
  220.     return (OK);
  221.     }
  222. /*******************************************************************************
  223. *
  224. * memPartAvailable - return the amount of available memory in the partition
  225. *
  226. * This routine returns the amount of available memory in a specified partition.
  227. * Additionally, if largestBlock is set to non-NULL, the value it points to
  228. * is set to the size in bytes of the largest available block.
  229. * If printEach is TRUE, each block's address and size is printed.
  230. * RETURNS: Number of bytes of remaining memory, or ERROR.
  231. *
  232. * NOMANUAL
  233. */
  234. static size_t memPartAvailable 
  235.     (
  236.     PART_ID   partId,  /* partition ID                              */
  237.     size_t *     largestBlock, /* returns largest block of memory in bytes  */
  238.     BOOL  printEach /* TRUE if each block to be printed          */
  239.     )
  240.     {
  241.     BLOCK_HDR *  pHdr;
  242.     DL_NODE *  pNode;
  243.     size_t  totalBytes   = 0;
  244.     size_t  biggestWords = 0;
  245.     int  ix           = 1;
  246.     if (ID_IS_SHARED (partId))  /* partition is shared? */
  247. {
  248. if (smMemPartShowRtn == NULL)
  249.     {
  250.     errno = S_smObjLib_NOT_INITIALIZED;
  251.     return (ERROR);
  252.     }
  253. /* shared partitions not supported yet */
  254.         return (ERROR);
  255. }
  256.     /* partition is local */
  257.     if (OBJ_VERIFY (partId, memPartClassId) != OK)
  258. return (ERROR);
  259.     for (pNode = DLL_FIRST (&partId->freeList);
  260.  pNode != NULL;
  261.  pNode = DLL_NEXT (pNode))
  262. {
  263. pHdr = NODE_TO_HDR (pNode);
  264. /* check consistency and delete if not */
  265. if (!memPartBlockIsValid (partId, pHdr, pHdr->free))
  266.     {
  267.     printf ("  invalid block at %#x deletedn", (UINT) pHdr);
  268.     dllRemove (&partId->freeList, HDR_TO_NODE (pHdr));
  269.     return (ERROR);
  270.     }
  271. else
  272.     {
  273.     totalBytes += 2 * pHdr->nWords;
  274.     if (pHdr->nWords > biggestWords)
  275. biggestWords = pHdr->nWords;
  276.     if (printEach)
  277. printf ("  %4d 0x%08x %10un", ix++, (UINT) pHdr,
  278. (UINT) 2 * pHdr->nWords);
  279.     }
  280. }
  281.     if (largestBlock != NULL)
  282.         *largestBlock = biggestWords * 2;
  283.     return (totalBytes);
  284.     }
  285. /*******************************************************************************
  286. *
  287. * memPartInfoGet - get partition information
  288. *
  289. * This routine takes a partition ID and a pointer to a MEM_PART_STATS structure.
  290. * All the parameters of the structure are filled in with the current partition
  291. * information.
  292. *
  293. * RETURNS: OK if the structure has valid data, otherwise ERROR.
  294. *
  295. * SEE ALSO: memShow()
  296. */
  297. STATUS memPartInfoGet 
  298.     (
  299.     PART_ID  partId, /* partition ID          */
  300.     MEM_PART_STATS    * ppartStats      /* partition stats structure */
  301.     )
  302.     {
  303.     BLOCK_HDR    * pHdr;
  304.     DL_NODE      * pNode;
  305.     if (partId == NULL || ppartStats == NULL)
  306. {
  307. return (ERROR);
  308. }
  309.     if (ID_IS_SHARED (partId))  /* partition is shared? */
  310. {
  311. return (ERROR);         /* No support for Shared Partitions */
  312. }
  313.     /* partition is local */
  314.     if (OBJ_VERIFY (partId, memPartClassId) != OK)
  315. return (ERROR);
  316.     ppartStats->numBytesFree     = 0;
  317.     ppartStats->numBlocksFree    = 0;
  318.     ppartStats->maxBlockSizeFree = 0;
  319.     ppartStats->numBytesAlloc    = 0;
  320.     ppartStats->numBlocksAlloc   = 0;
  321.     semTake (&partId->sem, WAIT_FOREVER);
  322.     /* Get free memory information */
  323.     for (pNode = DLL_FIRST (&partId->freeList);
  324.  pNode != NULL;
  325.  pNode = DLL_NEXT (pNode))
  326. {
  327. pHdr = NODE_TO_HDR (pNode);
  328. /* check consistency and delete if not */
  329. if (!memPartBlockIsValid (partId, pHdr, pHdr->free))
  330.     {
  331.     dllRemove (&partId->freeList, HDR_TO_NODE (pHdr));
  332.          semGive (&partId->sem);
  333.     printf ("  invalid block at %#x deletedn", (UINT) pHdr);
  334.     return (ERROR);
  335.     }
  336. else
  337.     {
  338.     /* All byte counts are in words, the conversion is done later */
  339.     ppartStats->numBytesFree +=  pHdr->nWords;
  340.     ppartStats->numBlocksFree++;
  341.     if (ppartStats->maxBlockSizeFree < pHdr->nWords)
  342. ppartStats->maxBlockSizeFree = pHdr->nWords;
  343.     }
  344. }
  345.     /* Get allocated memory information */
  346.     if (partId->curBlocksAllocated != 0)
  347. {
  348. ppartStats->numBytesAlloc  = partId->curWordsAllocated; 
  349. ppartStats->numBlocksAlloc = partId->curBlocksAllocated;
  350. }
  351.     semGive (&partId->sem);
  352.     /* Convert from words to bytes */
  353.     ppartStats->numBytesFree *= 2;
  354.     ppartStats->maxBlockSizeFree *= 2;
  355.     ppartStats->numBytesAlloc  *= 2;
  356.     return (OK);
  357.     }