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

  1. // heapview.hpp
  2. //
  3. // Created 10/04/98
  4. //
  5. // (C)Copyright 1998-1999 Microsoft Corporation, All rights reserved.
  6. //
  7.  
  8. #ifndef __HEAPVIEW_HPP__
  9. #define __HEAPVIEW_HPP__
  10.  
  11. #include "objview.hpp"
  12. #include "hpmonmgr.hpp"
  13.  
  14.  
  15. enum HeapViewerEvents
  16. {
  17.     WM_HVEVENT_THREAD_CREATED = WM_OVEVENT_LAST,
  18.     WM_HVEVENT_THREAD_DESTROYED,
  19.  
  20.     WM_HVEVENT_NEW_PACKAGE,
  21.     WM_HVEVENT_CLASS_LOADED,
  22.     WM_HVEVENT_CLASS_UNLOADED,
  23.  
  24.     WM_HVEVENT_ROOT_REFERENCES,
  25. };
  26.  
  27.  
  28. class HeapViewer : public ObjectViewer
  29. {
  30. private:
  31.  
  32.     // Tree roots
  33.     HTREEITEM m_htiClasses;
  34.     HTREEITEM m_htiThreads;
  35.     HTREEITEM m_htiObjects;
  36.     HTREEITEM m_htiRoots;
  37.  
  38.     // Execution is suspended
  39.     BOOL m_fStopped;
  40.  
  41.  
  42.     //------------------------------------------------------------------------
  43.     // Synchronization.  Shares critical section with enclosing MDI frame.
  44.  
  45.     VOID Enter ()
  46.     {
  47.         m_mgr->Enter();
  48.     }
  49.  
  50.     VOID Leave ()
  51.     {
  52.         m_mgr->Leave();
  53.     }
  54.  
  55. #ifdef DEBUG
  56.     BOOL Entered ()
  57.     {
  58.         return m_mgr->Entered();
  59.     }
  60. #endif
  61.  
  62.  
  63.     //------------------------------------------------------------------------
  64.  
  65.     BOOL IsRunning ()
  66.     {
  67.         ASSERT(Entered());
  68.         return !m_fStopped;
  69.     }
  70.  
  71.     BOOL IsStopped ()
  72.     {
  73.         return !IsRunning();
  74.     }
  75.  
  76.  
  77.     //------------------------------------------------------------------------
  78.     // UI manipulation
  79.  
  80.     LRESULT CALLBACK WndProc (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam);
  81.  
  82.     static int PopulateTreeCB (ID id, PVOID token);
  83.     static int PopulateRootObjectsCB (ID id, ObjectID refvmid, PVOID token);
  84.  
  85.  
  86.     //------------------------------------------------------------------------
  87.     // Tree-specific stuff
  88.  
  89.     HTREEITEM GetRootForThreads ();
  90.     HTREEITEM GetRootForClasses ();
  91.     HTREEITEM GetRootForPackage (PKGID pkg);
  92.     HTREEITEM GetRootForObjects ();
  93.     HTREEITEM GetRootForRoots ();
  94.  
  95.     HTREEITEM GetTreeItemForThread (THREADID thd);
  96.     HTREEITEM GetTreeItemForClass (CLASSID cls);
  97.     HTREEITEM GetTreeItemForRoot (ROOTID root);
  98.     HTREEITEM GetTreeItemForStackFrame (HTREEITEM htiThread, STACKID frm);
  99.     HTREEITEM GetTreeItemForStackFrame (STACKID frm);
  100.     HTREEITEM GetTreeItemForID (ID id);
  101.  
  102.     HTREEITEM AddNewThread (THREADID thd);
  103.  
  104.     BOOL AddRootReferences (RootReferencesEventInfo *pinfo);
  105.  
  106.  
  107.     //------------------------------------------------------------------------
  108.  
  109.     // IHeapMonitorClient methods
  110.  
  111.     STDMETHODIMP OnStoppedExecution ()
  112.     {
  113.         // Block until the UI thread has done whatever it might be doing while (!m_fStopped).
  114.         Enter();
  115.         {
  116.             m_fStopped = m_mgr->IsStopped_Safe();
  117.         }
  118.         Leave();
  119.  
  120.         return ObjectViewer::OnStoppedExecution();
  121.     }
  122.     
  123.     STDMETHODIMP OnResumeExecution ()
  124.     {
  125.         // Block until the UI thread has done whatever it might be doing while (m_fStopped).
  126.         Enter();
  127.         {
  128.             m_fStopped = FALSE;
  129.         }
  130.         Leave();
  131.  
  132.         if (m_htiObjects != NULL && m_htiObjects != TVI_ROOT)
  133.             DeleteTreeItem(m_htiObjects);
  134.         m_htiObjects = NULL;
  135.  
  136.         return ObjectViewer::OnResumeExecution();
  137.     }
  138.     
  139.     STDMETHODIMP OnThreadCreated (THREADID thread)
  140.     {
  141.         SendMessage(m_hwnd, WM_HVEVENT_THREAD_CREATED, 0, (LPARAM)thread);
  142.         return ObjectViewer::OnThreadCreated(thread);
  143.     }
  144.  
  145.     STDMETHODIMP OnDestroyThread (THREADID thread)
  146.     {
  147.         if (m_htiThreads)
  148.             SendMessage(m_hwnd, WM_HVEVENT_THREAD_DESTROYED, 0, (LPARAM)thread);
  149.         return ObjectViewer::OnDestroyThread(thread);
  150.     }
  151.  
  152.     STDMETHODIMP OnPackageCreated (PKGID pkg)
  153.     {
  154.         SendMessage(m_hwnd, WM_HVEVENT_NEW_PACKAGE, 0, (LPARAM)pkg);
  155.         return ObjectViewer::OnPackageCreated(pkg);
  156.     }
  157.  
  158.     STDMETHODIMP OnClassLoaded (CLASSID cls)
  159.     {
  160.         SendMessage(m_hwnd, WM_HVEVENT_CLASS_LOADED, 0, (LPARAM)cls);
  161.         return ObjectViewer::OnClassLoaded(cls);
  162.     }
  163.     
  164.     STDMETHODIMP OnUnloadClass (CLASSID cls)
  165.     {
  166.         SendMessage(m_hwnd, WM_HVEVENT_CLASS_UNLOADED, 0, (LPARAM)cls);
  167.         return ObjectViewer::OnUnloadClass(cls);
  168.     }
  169.  
  170.     STDMETHODIMP RootReferences (RootReferencesEventInfo *pinfo)
  171.     {
  172.         if (m_fStopped)
  173.             SendMessage(m_hwnd, WM_HVEVENT_ROOT_REFERENCES, 0, (LPARAM)pinfo);
  174.         return ObjectViewer::RootReferences(pinfo);
  175.     }
  176.  
  177.     //STDMETHODIMP OnObjectStatusChange (OBJID id)
  178.  
  179.     STDMETHODIMP RootDiscoveryComplete ()
  180.     {
  181.         if (m_fStopped)
  182.             RedrawTree();
  183.         return S_OK;
  184.     }
  185.  
  186.     STDMETHODIMP ObjectDiscoveryComplete ()
  187.     {
  188.         return S_OK;
  189.     }
  190.  
  191.  
  192.     //------------------------------------------------------------------------
  193.     
  194. public:
  195.  
  196.     HeapViewer ();
  197.  
  198.     BOOL Initialize (HeapMonitorManager *mgr);
  199. };
  200.  
  201.  
  202.  
  203. #endif /* __HEAPVIEW_HPP__ */
  204.  
  205.