home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 39 / IOPROG_39.ISO / SOFT / sdkjava40.exe / data1.cab / fg_Samples / Samples / Profiler / jviewprf / gcprof.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-04  |  3.9 KB  |  187 lines

  1. // gcprof.hpp
  2. //
  3. // Created 01/19/99
  4. //
  5. // (C) Copyright 1995 - 1999 Microsoft Corporation.  All rights reserved.
  6. //
  7.  
  8. #ifndef __GCPROF_HPP__
  9. #define __GCPROF_HPP__
  10.  
  11. #include <jevmon.h>
  12.  
  13. #include "timer.hpp"
  14.  
  15. class EventMonitor;
  16.  
  17.  
  18. class GCProfiler : private IHeapInfoCallback
  19. {
  20.     ULONG m_refcount;
  21.  
  22.     EventMonitor *m_pmon;
  23.     IJavaHeapMonitor *m_heapmon;
  24.  
  25.     DWORD m_nGCs;
  26.  
  27.     struct GCProfilerEntry
  28.     {
  29.         ClassID id;
  30.  
  31.         ULONG nlive;
  32.         size_t cblive;
  33.         ULONG totalage;
  34.  
  35.         __int64 lastcount;
  36.  
  37.         GCProfilerEntry *next;
  38.     };
  39.  
  40.     GCProfilerEntry *m_hash[293];
  41.  
  42.     CRITICAL_SECTION m_cs;
  43.  
  44.     PROFTIME m_StartTime;
  45.  
  46.     CONTAINER_TYPE m_CurrentContainer;
  47.  
  48.     PSTR m_pszLastObjectClassName;
  49.     BOOL m_fLastObjectClassNameIsUtf8;
  50.  
  51.     ULONG m_nObjects;
  52.     size_t m_cbObjects;
  53.     ULONG m_nOrphans;
  54.  
  55.     unsigned m_iField;
  56.     BOOL m_fInHeap;
  57.  
  58.  
  59.     GCProfilerEntry *LookupObject (ClassID id)
  60.     {
  61.         GCProfilerEntry *cur;
  62.     
  63.         unsigned ibucket = ((unsigned)id % ARRAY_ELEMENTS(m_hash));
  64.         GCProfilerEntry **prev;
  65.  
  66.         prev = &m_hash[ibucket];
  67.         for (;;)
  68.         {
  69.             cur = *prev;
  70.             if (!cur)
  71.                 break;
  72.  
  73.             if (cur->id == id)
  74.             {
  75.                 *prev = cur->next;
  76.                 cur->next = m_hash[ibucket];
  77.                 m_hash[ibucket] = cur;
  78.                 return cur;
  79.             }
  80.  
  81.             prev = &cur->next;
  82.         }
  83.  
  84.         EnterCriticalSection(&m_cs);
  85.         {
  86.             prev = &m_hash[ibucket];
  87.             for (;;)
  88.             {
  89.                 cur = *prev;
  90.                 if (!cur)
  91.                     break;
  92.  
  93.                 if (cur->id == id)
  94.                 {
  95.                     *prev = cur->next;
  96.                     cur->next = m_hash[ibucket];
  97.                     m_hash[ibucket] = cur;
  98.                     return cur;
  99.                 }
  100.  
  101.                 prev = &cur->next;
  102.             }
  103.  
  104.             if ((cur = new GCProfilerEntry()) != NULL)
  105.             {
  106.                 ZeroMemory(cur, sizeof(*cur));
  107.                 cur->id = id;
  108.                 cur->next = m_hash[ibucket];
  109.                 m_hash[ibucket] = cur;
  110.             }
  111.         }
  112.         LeaveCriticalSection(&m_cs);
  113.  
  114.         return cur;
  115.     }
  116.  
  117.  
  118.     typedef int (GCProfiler::*POBJITERFN) (GCProfilerEntry *ent, PVOID token);
  119.  
  120.     int Iterate (POBJITERFN fn, PVOID token = NULL);
  121.  
  122.  
  123.     int DeleteCB (GCProfilerEntry *ent, PVOID token);
  124.     int InstanceDiscoveryCompletedCB (GCProfilerEntry *cur, PVOID token);
  125.  
  126.     VOID DumpRef (ObjectID objid, DWORD objflags);
  127.  
  128.  
  129.     VOID InstanceDiscovered (ClassID clsid, size_t size, ULONG age)
  130.     {
  131.         GCProfilerEntry *ent = LookupObject(clsid);
  132.         if (ent)
  133.         {
  134.             ent->nlive++;
  135.             ent->cblive += size;
  136.             ent->totalage += age;
  137.         }
  138.  
  139.         m_nObjects++;
  140.         m_cbObjects += size;
  141.     }
  142.  
  143.     VOID InstanceDiscoveryCompleted ();
  144.  
  145.  
  146.     // *** IUnknown interface
  147.  
  148.     STDMETHODIMP QueryInterface(REFIID, void **);
  149.     STDMETHODIMP_(ULONG) AddRef(void);
  150.     STDMETHODIMP_(ULONG) Release(void);
  151.  
  152.     // *** IHeapInfoCallback interface
  153.  
  154.     STDMETHODIMP BeginContainer(CONTAINER_TYPE type, UniqueID id1, UniqueID id2);
  155.     STDMETHODIMP RootReferences(const ObjectID *prefs, unsigned nrefs, const DWORD *pflags);
  156.     STDMETHODIMP ObjectReferences(ObjectID id, DWORD flags, const ObjectID *prefs, unsigned nrefs, const DWORD *pflags);
  157.  
  158.  
  159. public:
  160.  
  161.     GCProfiler ()
  162.     {
  163.         m_refcount = 1;
  164.  
  165.         m_pmon = NULL;
  166.         m_heapmon = NULL;
  167.  
  168.         m_nGCs = 0;
  169.  
  170.         ZeroMemory(&m_hash, sizeof(m_hash));
  171.  
  172.         InitializeCriticalSection(&m_cs);
  173.     }
  174.  
  175.     HRESULT Initialize (EventMonitor *pmon);
  176.  
  177.     VOID Destruct ();
  178.  
  179.  
  180.     VOID GCStarted ();
  181.     VOID GCFinished ();
  182. };
  183.  
  184.  
  185. #endif /* __GCPROF_HPP__ */
  186.  
  187.