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

VxWorks

开发平台:

C/C++

  1. /* smMemShow.c - shared memory management show routines (VxMP Option) */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01k,06may02,mas  cache flush and volatile fix (SPR 68334); bridge flush fix
  7.  (SPR 68844)
  8. 01j,24oct01,mas  fixed gnu warnings (SPR 71113); doc update (SPR 71149)
  9. 01i,14jul97,dgp  doc: add windsh x-ref to smMemShow()
  10. 01h,14feb93,jdi  documentation cleanup for 5.1.
  11. 01g,29jan93,pme  added little endian support.
  12. 01f,21nov92,jdi  documentation cleanup.
  13. 01e,21nov92,jdi  documentation cleanup.
  14. 01d,02oct92,pme  documentation cleanup.
  15.                  added SPARC support.
  16. 01c,29sep92,pme  fixed WARNING in printf call.
  17. 01b,29jul92,pme  Added partition type check.
  18. 01a,19jul92,pme  written.
  19. */
  20. /*
  21. DESCRIPTION
  22. This library provides routines to show the statistics on a shared memory
  23. system partition.
  24. General shared memory management routines are provided by smMemLib.
  25. CONFIGURATION
  26. The routines in this library are included by default if the component
  27. INCLUDE_SM_OBJ is included.
  28. AVAILABILITY
  29. This module is distributed as a component of the unbundled shared memory
  30. objects support option, VxMP.
  31. INCLUDE FILES: smLib.h, smObjLib.h, smMemLib.h
  32. SEE ALSO: smMemLib,
  33. tb VxWorks Programmer's Guide: Shared Memory Objects
  34. */
  35. /* includes */
  36. #include "vxWorks.h"
  37. #include "errno.h"
  38. #include "semLib.h"
  39. #include "smObjLib.h"
  40. #include "smLib.h"
  41. #include "logLib.h"
  42. #include "intLib.h"
  43. #include "smMemLib.h"
  44. #include "taskLib.h"
  45. #include "cacheLib.h"
  46. #include "stdlib.h"
  47. #include "stdio.h"
  48. #include "string.h"
  49. #include "netinet/in.h"
  50. /******************************************************************************
  51. *
  52. * smMemShowInit - initialize shared memory manager show routine
  53. *
  54. * This routine links the shared memory objects show routine into the VxWorks
  55. * system.  These routines are included automatically by defining
  56. * %INCLUDE_SHOW_ROUTINES in configAll.h.
  57. *
  58. * RETURNS: N/A
  59. *
  60. * NOMANUAL
  61. */
  62. void smMemShowInit (void)
  63.     {
  64.     smMemPartShowRtn = (FUNCPTR) smMemPartShow;
  65.     }
  66. /******************************************************************************
  67. *
  68. * smMemPartShow - show shared partition blocks and statistics
  69. *
  70. * For a specified shared partition, this routine displays the total 
  71. * amount of free space in the partition, the number of blocks, the average 
  72. * block size, and the maximum block size.  It also shows the number of 
  73. * blocks currently allocated, and the average allocated block size.
  74. *
  75. * In addition, if <type> is 1, this routine displays a list of all the blocks
  76. * in the free list of the specified shared partition.
  77. *
  78. * WARNING
  79. * This routine locks access to the partition while displaying the information.
  80. * This can compromise the access time to the partition from other CPU in 
  81. * the system.  Generally this routine is used for debugging purposes only.
  82. *
  83. * RETURNS: OK or ERROR.
  84. *
  85. * ERRNO:
  86. *  S_objLib_OBJ_ID_ERROR
  87. *  S_smObjLib_LOCK_TIMEOUT
  88. *
  89. * SEE ALSO: smMemShow()
  90. * NOMANUAL
  91. */
  92. STATUS smMemPartShow 
  93.     (
  94.     SM_PART_ID partId,     /* global partition id to use */
  95.     int        type        /* 0 = statistics, 1 = statistics & list */
  96.     )
  97.     {
  98.     SM_BLOCK_HDR volatile * pHdr;
  99.     SM_DL_NODE volatile *   pNode;
  100.     unsigned                totalBytes   = 0;
  101.     unsigned                biggestWords = 0;
  102.     int                     numBlocks;
  103.     int                     ix = 1;
  104.     SM_PART_ID volatile     partIdv = (SM_PART_ID volatile) partId;
  105.     int                     temp;            /* temp storage */
  106.     if (partId == NULL)
  107. {
  108. printf ("No partId specified.n");
  109. return (ERROR);
  110. }
  111.     CACHE_PIPE_FLUSH ();                        /* CACHE FLUSH   [SPR 68334] */
  112.     temp = partIdv->verify;                     /* PCI bridge bug [SPR 68844]*/
  113.     if (SM_OBJ_VERIFY (partIdv) != OK) /* shared object? */
  114.         return (ERROR);
  115.     if (ntohl (partIdv->objType) != MEM_PART_TYPE_SM_STD)/* shared partition?*/
  116. {
  117. errno = S_objLib_OBJ_ID_ERROR;
  118. return (ERROR);
  119. }
  120.     /* print out list header if we are going to print list */
  121.     if (type > 0)
  122. {
  123. printf ("nFREE LIST:n");
  124. printf ("  num     addr      sizen");
  125. printf ("  --- ---------- ----------n");
  126. }
  127.     if (smMemPartAccessGet(partIdv) != OK)
  128.         {
  129.         return (ERROR);
  130.         }
  131.     /*
  132.      * go through free list and find total free and largest free,
  133.      * and print each block if specified
  134.      */
  135.     for (pNode = (SM_DL_NODE volatile *) SM_DL_FIRST (&partId->freeList);
  136.  pNode != LOC_NULL;
  137.  pNode = (SM_DL_NODE volatile *) SM_DL_NEXT (pNode))
  138. {
  139. pHdr = (SM_BLOCK_HDR volatile *) SM_NODE_TO_HDR (pNode);
  140.         /* check consistency and delete if not */
  141.         if (!smMemPartBlockIsValid (partIdv, pHdr, TRUE))
  142.             {
  143.             printf ("  invalid block at %p deletedn", pHdr);
  144.             smDllRemove (&partId->freeList, SM_HDR_TO_NODE (pHdr));
  145.             }
  146.         else
  147.     {
  148.     totalBytes += 2 * (ntohl (pHdr->nWords));
  149.     if (ntohl (pHdr->nWords) > biggestWords)
  150. biggestWords = ntohl (pHdr->nWords);
  151.     if (type >= 1)
  152. printf ("  %3d %#10x %10dn", ix++, LOC_TO_GLOB_ADRS (pHdr), 
  153. 2 * ntohl (pHdr->nWords));
  154.     }
  155. }
  156.     if (type > 0)
  157.         {
  158. printf ("nn");
  159.         }
  160.     numBlocks = smDllCount (&partId->freeList);
  161.     if (type > 0)
  162.         {
  163. printf ("SUMMARY:n");
  164.         }
  165.     printf (" status   bytes    blocks   ave block  max blockn");
  166.     printf (" ------ --------- -------- ---------- ----------n");
  167.     printf ("currentn");
  168.     if (numBlocks != 0)
  169.         {
  170. printf ("   free  %8d  %7d  %9d %9dn", totalBytes, numBlocks,
  171. totalBytes / numBlocks, 2 * biggestWords);
  172.         }
  173.     else
  174.         {
  175. printf ("   no free blocksn");
  176.         }
  177.     if (ntohl (partIdv->curBlocksAllocated) != 0)
  178.         {
  179. printf ("  alloc  %8d  %7d  %9d        -n",
  180. 2 * ntohl (partId->curWordsAllocated), 
  181. ntohl (partId->curBlocksAllocated),
  182.         (2 * ntohl (partId->curWordsAllocated)) / 
  183. ntohl (partId->curBlocksAllocated));
  184.         }
  185.     else
  186.         {
  187. printf ("   no allocated blocksn");
  188.         }
  189.     printf ("cumulativen");
  190.     if (ntohl (partIdv->cumBlocksAllocated) != 0)
  191.         {
  192. printf ("  alloc  %8d  %7d  %9d        -n",
  193. 2 * ntohl (partId->cumWordsAllocated), 
  194. ntohl (partId->cumBlocksAllocated),
  195. (2 * ntohl (partId->cumWordsAllocated)) / 
  196. ntohl (partId->cumBlocksAllocated));
  197.         }
  198.     else
  199.         {
  200. printf ("   no allocated blocksn");
  201.         }
  202.     if (smMemPartAccessRelease (partIdv) != OK)
  203.         {
  204.         return (ERROR);
  205.         }
  206.     return (OK);
  207.     }
  208. /******************************************************************************
  209. *
  210. * smMemShow - show the shared memory system partition blocks and statistics (VxMP Option)
  211. *
  212. * This routine displays the total amount of free space in the shared memory
  213. * system partition, including the number of blocks, the average block size,
  214. * and the maximum block size.  It also shows the number of blocks currently
  215. * allocated, and the average allocated block size.
  216. *
  217. * If <type> is 1, it displays a list of all the blocks in the free list of
  218. * the shared memory system partition.
  219. *
  220. * WARNING
  221. * This routine locks access to the shared memory system partition while
  222. * displaying the information.  This can compromise the access time to
  223. * the partition from other CPUs in the system.  Generally, this routine is
  224. * used for debugging purposes only.
  225. *
  226. * EXAMPLE
  227. * cs
  228. *    -> smMemShow 1
  229. *    FREE LIST:
  230. *      num    addr       size
  231. *      --- ---------- ----------
  232. *        1   0x4ffef0        264
  233. *        2   0x4fef18       1700
  234. *
  235. *    SUMMARY:
  236. *        status        bytes    blocks   ave block  max block
  237. *    --------------- --------- -------- ---------- ----------
  238. *            current
  239. *               free      1964        2        982       1700
  240. *              alloc      2356        1       2356         -
  241. *         cumulative
  242. *              alloc      2620        2       1310         -
  243. *    value = 0 = 0x0
  244. * ce
  245. *
  246. * AVAILABILITY
  247. * This routine is distributed as a component of the unbundled shared memory
  248. * objects support option, VxMP.
  249. * RETURNS: N/A
  250. *
  251. * SEE ALSO
  252. * windsh, chapter on target shell in 
  253. * tb VxWorks Programmer's Guide, 
  254. * tb Tornado User's Guide: Shell
  255. */
  256. void smMemShow 
  257.     (
  258.     int type  /* 0 = statistics, 1 = statistics & list */
  259.     )
  260.     {
  261.     smMemPartShow ((SM_PART_ID) smSystemPartId, type);
  262.     }