home *** CD-ROM | disk | FTP | other *** search
- // gcview.cpp
- //
- // Created 10/08/98
- //
- // (C)Copyright 1998-1999 Microsoft Corporation, All rights reserved.
- //
-
- #include "pch.hpp"
- #pragma hdrstop
-
- #include "gcview.hpp"
- #include "hpmonmgr.hpp"
-
-
- BOOL GCHistoryViewer::s_fRegisteredClass = FALSE;
-
-
- //static
- LRESULT CALLBACK GCHistoryViewer::WndProc (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- GCHistoryViewer *gchv = (GCHistoryViewer*)GetWindowLong(wnd, GWL_USERDATA);
-
- switch (msg)
- {
- case WM_SIZE:
- {
- RECT rc;
- GetClientRect(wnd, &rc);
- MoveWindow(gchv->m_list, rc.left, rc.top, rc.right, rc.bottom, TRUE);
- }
- break;
-
- case WM_NOTIFY:
- {
- //int idCtrl = (int)wParam;
- NMHDR *pnmh = (NMHDR*)lParam;
-
- switch (pnmh->code)
- {
- case LVN_GETDISPINFO:
- {
- NMLVDISPINFO *pnmv = (NMLVDISPINFO*)lParam;
- LVITEM *pitem = &pnmv->item;
-
- if (pitem->mask & LVIF_TEXT)
- {
- PerGCInformation *gcinfo = NULL;
-
- if (pitem->mask & LVIF_PARAM)
- {
- gcinfo = (PerGCInformation*)pitem->lParam;
- }
- else
- {
- LVITEM lvi;
- lvi.mask = LVIF_PARAM;
- lvi.iItem = pitem->iItem;
- lvi.iSubItem = 0;
- if (ListView_GetItem(gchv->m_list, &lvi))
- gcinfo = (PerGCInformation*)pitem->lParam;
- }
-
- if (gcinfo != NULL)
- {
- static DWORD rgFlagsNeededForCol[] =
- {
- /*GHV_COL_NUM*/ 0,
- /*GHV_COL_OBJECTS*/ HMC_INFO_HEAP_OBJECTS,
- /*GHV_COL_SIZE*/ HMC_INFO_HEAP_OBJECTS,
- /*GHV_COL_MULTIREFOBJECTS*/ (HMC_INFO_HEAP_OBJECTS | HMC_INFO_HEAP_OBJECT_REFS),
- /*GHV_COL_OBJECTEDGES*/ (HMC_INFO_HEAP_OBJECTS | HMC_INFO_HEAP_OBJECT_REFS),
- /*GHV_COL_ROOTS*/ HMC_INFO_HEAP_ROOTS,
- /*GHV_COL_ROOTEDGES*/ HMC_INFO_HEAP_ROOT_REFS,
- /*GHV_COL_MONITORS*/ HMC_INFO_COUNT_MONITORS,
- };
-
- int col = pitem->iSubItem;
-
- DWORD FlagsNeeded = rgFlagsNeededForCol[col];
- if ((gcinfo->InfoMaskCollected & FlagsNeeded) == FlagsNeeded)
- {
- switch (col)
- {
- case GHV_COL_NUM:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->iGC);
- return 0;
-
- case GHV_COL_OBJECTS:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->nObjects);
- return 0;
-
- case GHV_COL_SIZE:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->cbObjects);
- return 0;
-
- case GHV_COL_MULTIREFOBJECTS:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->nObjectsWithMultipleReferences);
- return 0;
-
- case GHV_COL_OBJECTEDGES:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->nObjectEdges);
- return 0;
-
- case GHV_COL_ROOTS:
- {
- ULONG nRoots = 0;
- for (unsigned i = 0; i < ARRAY_ELEMENTS(gcinfo->rgcRoots); i++)
- nRoots += gcinfo->rgcRoots[i];
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", nRoots);
- }
- return 0;
-
- case GHV_COL_ROOTEDGES:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%u", gcinfo->nRootEdges);
- return 0;
-
- case GHV_COL_MONITORS:
- FormatNumber(pitem->pszText, pitem->cchTextMax, "%I64u", gcinfo->nObjectMonitors);
- return 0;
-
- default:;
- }
- }
- else
- {
- FitText(pitem->pszText, pitem->cchTextMax, "---");
- return 0;
- }
- }
- }
- }
- break;
- }
- }
- break;
- }
-
- return gchv->BaseWndProc(wnd, msg, wParam, lParam);
- }
-
-
- BOOL GCHistoryViewer::OnCreateWindow ()
- {
- BOOL result;
-
- HINSTANCE hinst = m_mgr->GetInstance();
-
- RECT rc;
-
- GetClientRect(m_hwnd, &rc);
-
- result = (m_list = CreateWindow(
- WC_LISTVIEW,
- NULL,
- WS_CHILD | LVS_REPORT,
- rc.left, rc.top, rc.right, rc.bottom,
- m_hwnd,
- NULL,
- hinst,
- NULL)) != NULL;
-
- if (result)
- {
- static PSTR colnames[] = {
- "GC number",
- "Objects",
- "Bytes of objects",
- "Objects with multiple references",
- "Object out-edges",
- "Roots",
- "Root edges",
- "Monitors",
- };
-
- unsigned spaceleft = rc.right - rc.left;
-
- LVCOLUMN lvc;
- lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
- lvc.fmt = LVCFMT_CENTER;
-
- unsigned i = 0;
- for (;;)
- {
- lvc.cx = spaceleft / (GHV_NUM_COLUMNS-i);
-
- lvc.pszText = colnames[i];
-
- result = (ListView_InsertColumn(m_list, i, &lvc) != -1);
- if (!result)
- break;
-
- i++;
- if (i >= GHV_NUM_COLUMNS)
- break;
- spaceleft -= lvc.cx;
- }
- }
-
- if (result)
- {
- LVITEM lvi;
- lvi.mask = LVIF_PARAM | LVIF_TEXT;
- lvi.pszText = LPSTR_TEXTCALLBACK;
- lvi.iSubItem = 0;
-
- unsigned i = 0;
- PerGCInformation *gcinfo = m_mgr->GetCurrentGCInfo();
-
- m_iLastGCAdded = 0;
- if (gcinfo)
- {
- m_iLastGCAdded = gcinfo->iGC;
-
- do
- {
- lvi.iItem = i;
- lvi.lParam = (LPARAM)gcinfo;
- result = ListView_InsertItem(m_list, &lvi) != -1;
- if (!result)
- break;
-
- gcinfo = gcinfo->next;
- i++;
- }
- while (gcinfo);
- }
- }
-
- if (result)
- {
- ShowWindow(m_list, SW_SHOWNA);
- }
-
- return result;
- }
-
-
- STDMETHODIMP GCHistoryViewer::ObjectDiscoveryComplete ()
- {
- PerGCInformation *pNewGCInfo = m_mgr->GetCurrentGCInfo();
- ASSERT(pNewGCInfo->iGC >= m_iLastGCAdded);
-
- if (pNewGCInfo->iGC != m_iLastGCAdded)
- {
- LVITEM lvi;
- lvi.mask = LVIF_PARAM | LVIF_TEXT;
- lvi.pszText = LPSTR_TEXTCALLBACK;
- lvi.iSubItem = 0;
- lvi.iItem = 0;
- lvi.lParam = (LPARAM)pNewGCInfo;
- ListView_InsertItem(m_list, &lvi);
-
- m_iLastGCAdded = pNewGCInfo->iGC;
- }
-
- return S_OK;
- }
-
-
- BOOL GCHistoryViewer::Initialize (HeapMonitorManager *mgr)
- {
- BOOL result = TRUE;
-
- if (!s_fRegisteredClass)
- {
- WNDCLASS wc;
- ZeroMemory(&wc, sizeof(wc));
- wc.lpfnWndProc = &WndProc;
- wc.hInstance = mgr->GetInstance();
- wc.lpszClassName = WC_HEAPMONITOR_GCHISTORYVIEWER;
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- result = RegisterClass(&wc);
-
- s_fRegisteredClass = result;
- }
-
- if (result)
- {
- HeapMonitorClientRegistrationInfo reginfo;
- ZeroMemory(®info, sizeof(reginfo));
-
- reginfo.EventMask = HMC_HEAP_EVENTS;
- reginfo.InfoMask = ( HMC_INFO_HEAP_ROOTS
- | HMC_INFO_HEAP_ROOT_REFS
- | HMC_INFO_HEAP_OBJECTS
- | HMC_INFO_HEAP_OBJECT_REFS
- | HMC_INFO_COUNT_MONITORS);
-
- result = BaseInitialize(mgr, WC_HEAPMONITOR_GCHISTORYVIEWER, "GC History", ®info);
- }
-
- return result;
- }
-
-