a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* $Id$ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** @file
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * VBox Debugger GUI - Statistics.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2012 Oracle Corporation
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * available from http://www.virtualbox.org. This file is free software;
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * you can redistribute it and/or modify it under the terms of the GNU
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * General Public License (GPL) as published by the Free Software
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6ec4e1827eab6a424d672ef0e5a17b065e52db20vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Header Files *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define LOG_GROUP LOG_GROUP_DBGG
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include "VBoxDbgStatsQt4.h"
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QLocale>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QPushButton>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QSpinBox>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QLabel>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QClipboard>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QApplication>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QHBoxLayout>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QVBoxLayout>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QKeySequence>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QAction>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QContextMenuEvent>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <QHeaderView>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/err.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <VBox/log.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/string.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/mem.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#include <iprt/assert.h>
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Defined Constants And Macros *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/** The number of column. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define DBGGUI_STATS_COLUMNS 9
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Structures and Typedefs *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The state of a statistics sample node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is used for two pass refresh (1. get data, 2. update the view) and
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * for saving the result of a diff.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef enum DBGGUISTATSNODESTATE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The typical invalid zeroth entry. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kInvalid = 0,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The node is the root node. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kRoot,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The node is visible. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kVisible,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The node should be refreshed. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kRefresh,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** diff: The node equals. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kDiffEqual,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** diff: The node in set 1 is less than the one in set 2. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kDiffSmaller,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** diff: The node in set 1 is greater than the one in set 2. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kDiffGreater,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** diff: The node is only in set 1. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kDiffOnlyIn1,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** diff: The node is only in set 2. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kDiffOnlyIn2,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The end of the valid state values. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync kDbgGuiStatsNodeState_kEnd
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} DBGGUISTATENODESTATE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * A tree node representing a statistic sample.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The nodes carry a reference to the parent and to its position among its
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * siblings. Both of these need updating when the grand parent or parent adds a
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * new child. This will hopefully not be too expensive but rather pay off when
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * we need to create a parent index.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct DBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Pointer to the parent. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Array of pointers to the child nodes. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE *papChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The number of children. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Our index among the parent's children. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The unit. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMUNIT enmUnit;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The data type.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * For filler nodes not containing data, this will be set to STAMTYPE_INVALID. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMTYPE enmType;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The data at last update. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync union
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_COUNTER. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMCOUNTER Counter;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_PROFILE. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMPROFILE Profile;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_PROFILE_ADV. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMPROFILEADV ProfileAdv;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_RATIO_U32. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMRATIOU32 RatioU32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_U8 & STAMTYPE_U8_RESET. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint8_t u8;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_U16 & STAMTYPE_U16_RESET. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint16_t u16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_U32 & STAMTYPE_U32_RESET. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t u32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_U64 & STAMTYPE_U64_RESET. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t u64;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync /** STAMTYPE_BOOL and STAMTYPE_BOOL_RESET. */
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync bool f;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** STAMTYPE_CALLBACK. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString *pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync } Data;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The delta. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int64_t i64Delta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The name. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char *pszName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The length of the name. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cchName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The description string. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString *pDescStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The node state. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGGUISTATENODESTATE enmState;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} DBGGUISTATSNODE;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Recursion stack.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsynctypedef struct DBGGUISTATSSTACK
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The top stack entry. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iTop;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The stack array. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync struct DBGGUISTATSSTACKENTRY
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The node. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The current child. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync } a[32];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync} DBGGUISTATSSTACK;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The item model for the statistics tree view.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This manages the DBGGUISTATSNODE trees.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStatsModel : public QAbstractItemModel
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The root of the sample tree. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprivate:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Next update child. This is UINT32_MAX when invalid. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t m_iUpdateChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Pointer to the node m_szUpdateParent represent and m_iUpdateChild refers to. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE m_pUpdateParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The length of the path. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t m_cchUpdateParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** The path to the current update parent, including a trailing slash. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char m_szUpdateParent[1024];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Inserted or/and removed nodes during the update. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool m_fUpdateInsertRemove;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pParent The parent object. See QAbstractItemModel in the Qt
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * docs for details.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsModel(QObject *a_pParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This will free all the data the model holds.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgStatsModel();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Updates the data matching the specified pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This will should invoke updatePrep, updateCallback and updateDone.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * It is vitally important that updateCallback is fed the data in the right
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * order. The code make very definite ASSUMPTIONS about the ordering being
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * strictly sorted and taking the slash into account when doing so.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns true if we reset the model and it's necessary to set the root index.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rPatStr The selection pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @remarks The default implementation is an empty stub.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual bool updateStatsByPattern(const QString &a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Similar to updateStatsByPattern, except that it only works on a sub-tree and
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * will not remove anything that's outside that tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rIndex The sub-tree root. Invalid index means root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @todo Create a default implementation using updateStatsByPattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void updateStatsByIndex(QModelIndex const &a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Reset the stats matching the specified pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rPatStr The selection pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @remarks The default implementation is an empty stub.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void resetStatsByPattern(QString const &a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Reset the stats of a sub-tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rIndex The sub-tree root. Invalid index means root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_fSubTree Whether to reset the sub-tree as well. Default is true.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @remarks The default implementation makes use of resetStatsByPattern
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void resetStatsByIndex(QModelIndex const &a_rIndex, bool a_fSubTree = true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Gets the model index of the root node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns root index.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex getRootIndex(void) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Set the root node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This will free all the current data before taking the ownership of the new
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * root node and its children.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pRoot The new root node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void setRootNode(PDBGGUISTATSNODE a_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Creates the root node. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE createRootNode(void);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Creates and insert a node under the given parent. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE createAndInsertNode(PDBGGUISTATSNODE pParent, const char *pszName, size_t cchName, uint32_t iPosition);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Creates and insert a node under the given parent with correct Qt
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * signalling. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE createAndInsert(PDBGGUISTATSNODE pParent, const char *pszName, size_t cchName, uint32_t iPosition);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Resets the node to a pristine state.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void resetNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Initializes a pristine node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static int initNode(PDBGGUISTATSNODE pNode, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit, const char *pszDesc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Updates (or reinitializes if you like) a node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void updateNode(PDBGGUISTATSNODE pNode, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit, const char *pszDesc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Called by updateStatsByPattern(), makes the necessary preparations.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Success indicator.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool updatePrepare(void);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Called by updateStatsByPattern(), finalizes the update.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @return See updateStatsByPattern().
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_fSuccess Whether the update was successful or not.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool updateDone(bool a_fSuccess);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * updateCallback() worker taking care of in-tree inserts and removals.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pszName The name of the tree element to update.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE updateCallbackHandleOutOfOrder(const char *pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * updateCallback() worker taking care of tail insertions.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pszName The name of the tree element to update.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE updateCallbackHandleTail(const char *pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * updateCallback() worker that advances the update state to the next data node
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * in anticipation of the next updateCallback call.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void updateCallbackAdvance(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Callback used by updateStatsByPattern() and updateStatsByIndex() to feed
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * changes.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @copydoc FNSTAMR3ENUM */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(int) updateCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMVISIBILITY enmVisibility, const char *pszDesc, void *pvUser);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Calculates the full path of a node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Number of bytes returned, negative value on buffer overflow
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param psz The output buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param cch The size of the buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static ssize_t getNodePath(PCDBGGUISTATSNODE pNode, char *psz, ssize_t cch);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync /**
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * Calculates the full path of a node, returning the string pointer.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @returns @a psz. On failure, NULL.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @param pNode The node.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @param psz The output buffer.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync * @param cch The size of the buffer.
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync static char *getNodePath2(PCDBGGUISTATSNODE pNode, char *psz, ssize_t cch);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Check if the first node is an ancestor to the second one.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns true/false.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pAncestor The first node, the alleged ancestor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pDescendant The second node, the alleged descendant.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static bool isNodeAncestorOf(PCDBGGUISTATSNODE pAncestor, PCDBGGUISTATSNODE pDescendant);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Advance to the next node in the tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the next node, NULL if we've reached the end or
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * was handed a NULL node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE nextNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Advance to the next node in the tree that contains data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the next data node, NULL if we've reached the end or
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * was handed a NULL node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE nextDataNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Advance to the previous node in the tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the previous node, NULL if we've reached the end or
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * was handed a NULL node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE prevNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Advance to the previous node in the tree that contains data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the previous data node, NULL if we've reached the end or
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * was handed a NULL node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The current node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE prevDataNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Removes a node from the tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns pNode.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static PDBGGUISTATSNODE removeNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * Removes a node from the tree and destroys it and all its descendants.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param pNode The node.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void removeAndDestroyNode(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /** Removes a node from the tree and destroys it and all its descendants
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * performing the required Qt signalling. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void removeAndDestroy(PDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destroys a statistics tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pRoot The root of the tree. NULL is fine.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void destroyTree(PDBGGUISTATSNODE a_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Stringifies exactly one node, no children.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is for logging and clipboard.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pNode The node.
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * @param a_rString The string to append the stringified node to.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Stringifies a node and its children.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is for logging and clipboard.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pNode The node.
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * @param a_rString The string to append the stringified node to.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Converts the specified tree to string.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * This is for logging and clipboard.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rRoot Where to start. Use QModelIndex() to start at the root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rString Where to return to return the string dump.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void stringifyTree(QModelIndex &a_rRoot, QString &a_rString) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Dumps the given (sub-)tree as XML.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rRoot Where to start. Use QModelIndex() to start at the root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rString Where to return to return the XML dump.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void xmlifyTree(QModelIndex &a_rRoot, QString &a_rString) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Puts the stringified tree on the clipboard.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rRoot Where to start. Use QModelIndex() to start at the root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void copyTreeToClipboard(QModelIndex &a_rRoot) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Worker for logTree. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void logNode(PDBGGUISTATSNODE a_pNode, bool a_fReleaseLog);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Logs a (sub-)tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rRoot Where to start. Use QModelIndex() to start at the root.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_fReleaseLog Whether to use the release log (true) or the debug log (false).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void logTree(QModelIndex &a_rRoot, bool a_fReleaseLog) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the unit. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strUnit(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the value/times. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strValueTimes(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the minimum value. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strMinValue(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the average value. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strAvgValue(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the maximum value. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strMaxValue(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the total value. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strTotalValue(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Gets the delta value. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static QString strDeltaValue(PCDBGGUISTATSNODE pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Destroys a node and all its children.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pNode The node to destroy.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static void destroyNode(PDBGGUISTATSNODE a_pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Converts an index to a node pointer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the node, NULL if invalid reference.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rIndex Reference to the index
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync inline PDBGGUISTATSNODE nodeFromIndex(const QModelIndex &a_rIndex) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_LIKELY(a_rIndex.isValid()))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return (PDBGGUISTATSNODE)a_rIndex.internalPointer();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /** @name Overridden QAbstractItemModel methods
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @{ */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual int columnCount(const QModelIndex &a_rParent) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual QVariant data(const QModelIndex &a_rIndex, int a_eRole) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual Qt::ItemFlags flags(const QModelIndex &a_rIndex) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual bool hasChildren(const QModelIndex &a_rParent) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual QVariant headerData(int a_iSection, Qt::Orientation a_ePrientation, int a_eRole) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual QModelIndex index(int a_iRow, int a_iColumn, const QModelIndex &a_rParent) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual QModelIndex parent(const QModelIndex &a_rChild) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual int rowCount(const QModelIndex &a_rParent) const;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ///virtual void sort(int a_iColumn, Qt::SortOrder a_eOrder);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @} */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Model using the VM / STAM interface as data source.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncclass VBoxDbgStatsModelVM : public VBoxDbgStatsModel, public VBoxDbgBase
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncpublic:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructor.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pDbgGui Pointer to the debugger gui object.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rPatStr The selection pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_pParent The parent object. NULL is fine.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsModelVM(VBoxDbgGui *a_pDbgGui, QString &a_rPatStr, QObject *a_pParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** Destructor */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual ~VBoxDbgStatsModelVM();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual bool updateStatsByPattern(const QString &a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync virtual void resetStatsByPattern(const QString &a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncprotected:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Enumeration callback used by createNewTree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static DECLCALLBACK(int) createNewTreeCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMVISIBILITY enmVisibility, const char *pszDesc, void *pvUser);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Constructs a new statistics tree by query data from the VM.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @returns Pointer to the root of the tree we've constructed. This will be NULL
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * if the STAM API throws an error or we run out of memory.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * @param a_rPatStr The selection pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE createNewTree(QString &a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync};
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*******************************************************************************
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync* Internal Functions *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync*******************************************************************************/
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Formats a number into a 64-byte buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic char *formatNumber(char *psz, uint64_t u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const char s_szDigits[] = "0123456789";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz += 63;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz-- = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned cDigits = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const unsigned iDigit = u64 % 10;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 /= 10;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz = s_szDigits[iDigit];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz--;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!(++cDigits % 3))
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync *psz-- = ',';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return psz;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Formats a number into a 64-byte buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * (18 446 744 073 709 551 615)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic char *formatNumberSigned(char *psz, int64_t i64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const char s_szDigits[] = "0123456789";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz += 63;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz-- = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const bool fNegative = i64 < 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t u64 = fNegative ? -i64 : i64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned cDigits = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const unsigned iDigit = u64 % 10;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 /= 10;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz = s_szDigits[iDigit];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz--;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!(++cDigits % 3))
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync *psz-- = ',';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (fNegative)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *--psz = '-';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return psz;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Formats a unsigned hexadecimal number into a into a 64-byte buffer.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic char *formatHexNumber(char *psz, uint64_t u64, unsigned cZeros)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const char s_szDigits[] = "0123456789abcdef";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz += 63;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz-- = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned cDigits = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const unsigned iDigit = u64 % 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 /= 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz = s_szDigits[iDigit];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ++cDigits;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!u64 && cDigits >= cZeros)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz--;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!(cDigits % 8))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz-- = '\'';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return psz;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0/* unused */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Formats a sort key number.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic void formatSortKey(char *psz, uint64_t u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const char s_szDigits[] = "0123456789abcdef";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* signed */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '+';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* 16 hex digits */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[16] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned i = 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (i-- > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const unsigned iDigit = u64 % 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 /= 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[i] = s_szDigits[iDigit];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[i] = '0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0/* unused */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/**
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Formats a sort key number.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncstatic void formatSortKeySigned(char *psz, int64_t i64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync static const char s_szDigits[] = "0123456789abcdef";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* signed */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t u64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (i64 >= 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '+';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 = i64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '-';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 = -i64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* 16 hex digits */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[16] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned i = 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (i-- > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (u64)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const unsigned iDigit = u64 % 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync u64 /= 16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[i] = s_szDigits[iDigit];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[i] = '0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::VBoxDbgStatsModel(QObject *a_pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : QAbstractItemModel(a_pParent),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRoot(NULL), m_iUpdateChild(UINT32_MAX), m_pUpdateParent(NULL), m_cchUpdateParent(0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::~VBoxDbgStatsModel()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyTree(m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRoot = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::destroyTree(PDBGGUISTATSNODE a_pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!a_pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!a_pRoot->pParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!a_pRoot->iSelf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyNode(a_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/* static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::destroyNode(PDBGGUISTATSNODE a_pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* destroy all our children */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t i = a_pNode->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (i-- > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyNode(a_pNode->papChildren[i]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->papChildren[i] = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* free the resources we're using */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->pParent = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemFree(a_pNode->papChildren);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->papChildren = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pNode->enmType == STAMTYPE_CALLBACK)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete a_pNode->Data.pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->Data.pStr = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->cChildren = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->iSelf = UINT32_MAX;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->enmUnit = STAMUNIT_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->enmType = STAMTYPE_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemFree(a_pNode->pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->pszName = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pNode->pDescStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete a_pNode->pDescStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->pDescStr = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifdef VBOX_STRICT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* poison it. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->pParent++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->Data.pStr++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->pDescStr++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->papChildren++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->cChildren = 8442;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Finally ourselves */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->enmState = kDbgGuiStatsNodeState_kInvalid;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTMemFree(a_pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createRootNode(void)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pRoot = (PDBGGUISTATSNODE)RTMemAllocZ(sizeof(DBGGUISTATSNODE));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->iSelf = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->enmType = STAMTYPE_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->enmUnit = STAMUNIT_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->pszName = (char *)RTMemDup("/", sizeof("/"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->cchName = 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pRoot->enmState = kDbgGuiStatsNodeState_kRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createAndInsertNode(PDBGGUISTATSNODE pParent, const char *pszName, size_t cchName, uint32_t iPosition)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = (PDBGGUISTATSNODE)RTMemAllocZ(sizeof(DBGGUISTATSNODE));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->iSelf = UINT32_MAX;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmType = STAMTYPE_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmUnit = STAMUNIT_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->pszName = (char *)RTMemDupEx(pszName, cchName, 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->cchName = cchName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kVisible;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Do we need to expand the array?
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!(pParent->cChildren & 31))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync void *pvNew = RTMemRealloc(pParent->papChildren, sizeof(*pParent->papChildren) * (pParent->cChildren + 32));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pvNew)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->papChildren = (PDBGGUISTATSNODE *)pvNew;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Insert it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->pParent = pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iPosition >= pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Last. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iPosition = pParent->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Shift all the items after ours. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iShift = pParent->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (iShift-- > iPosition)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pChild = pParent->papChildren[iShift];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->papChildren[iShift + 1] = pChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pChild->iSelf = iShift + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Insert ours */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->iSelf = iPosition;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->papChildren[iPosition] = pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->cChildren++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncPDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createAndInsert(PDBGGUISTATSNODE pParent, const char *pszName, size_t cchName, uint32_t iPosition)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_fUpdateInsertRemove)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsertNode(pParent, pszName, cchName, iPosition);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync beginInsertRows(createIndex(pParent->iSelf, 0, pParent), 0, 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsertNode(pParent, pszName, cchName, iPosition);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync endInsertRows();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::removeNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iPosition = pNode->iSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pParent->papChildren[iPosition] == pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t const cChildren = --pParent->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (; iPosition < cChildren; iPosition++)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pChild = pParent->papChildren[iPosition + 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->papChildren[iPosition] = pChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pChild->iSelf = iPosition;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifdef VBOX_STRICT /* poison */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent->papChildren[iPosition] = (PDBGGUISTATSNODE)0x42;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::removeAndDestroyNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::removeAndDestroy(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_fUpdateInsertRemove)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Removing is fun since the docs are imprecise as to how persistent
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * indexes are updated (or aren't). So, let try a few different ideas
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * and see which works.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 1
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* destroy the children first with the appropriate begin/endRemoveRows signals. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGGUISTATSSTACK Stack;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[0].pNode = pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[0].iChild = -1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (Stack.iTop >= 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* get top element */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = Stack.a[Stack.iTop].pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iChild = ++Stack.a[Stack.iTop].iChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iChild < pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* push */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(Stack.iTop < (int32_t)RT_ELEMENTS(Stack.a));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[Stack.iTop].pNode = pNode->papChildren[iChild];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[Stack.iTop].iChild = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* pop and destroy all the children. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop--;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t i = pNode->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (i)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync beginRemoveRows(createIndex(pNode->iSelf, 0, pNode), 0, i - 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (i-- > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyNode(pNode->papChildren[i]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->cChildren = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync endRemoveRows();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!pNode->cChildren);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* finally the node it self. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync beginRemoveRows(createIndex(pParent->iSelf, 0, pParent), pNode->iSelf, pNode->iSelf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync endRemoveRows();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#elif 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* This ain't working, leaves invalid indexes behind. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync beginRemoveRows(createIndex(pParent->iSelf, 0, pParent), pNode->iSelf, pNode->iSelf);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync endRemoveRows();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Force reset() of the model after the update. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fUpdateInsertRemove = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroyNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::resetNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* free and reinit the data. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->enmType == STAMTYPE_CALLBACK)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete pNode->Data.pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.pStr = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmType = STAMTYPE_INVALID;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* free the description. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->pDescStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete pNode->pDescStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->pDescStr = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ int
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::initNode(PDBGGUISTATSNODE pNode, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit, const char *pszDesc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Copy the data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmUnit = enmUnit;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode->enmType == STAMTYPE_INVALID);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmType = enmType;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pszDesc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->pDescStr = new QString(pszDesc); /* ignore allocation failure (well, at least up to the point we can ignore it) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_COUNTER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.Counter = *(PSTAMCOUNTER)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.Profile = *(PSTAMPROFILE)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.RatioU32 = *(PSTAMRATIOU32)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_CALLBACK:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszString = (const char *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.pStr = new QString(pszString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u8 = *(uint8_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u16 = *(uint16_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u32 = *(uint32_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u64 = *(uint64_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL_RESET:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync pNode->Data.f = *(bool *)pvSample;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync break;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("%d\n", enmType));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateNode(PDBGGUISTATSNODE pNode, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit, const char *pszDesc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Reset and init the node if the type changed.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (enmType != pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->enmType != STAMTYPE_INVALID)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resetNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync initNode(pNode, enmType, pvSample, enmUnit, pszDesc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * ASSUME that only the sample value will change and that the unit, visibility
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * and description remains the same.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int64_t iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_COUNTER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t cPrev = pNode->Data.Counter.c;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.Counter = *(PSTAMCOUNTER)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = pNode->Data.Counter.c - cPrev;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t cPrevPeriods = pNode->Data.Profile.cPeriods;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.Profile = *(PSTAMPROFILE)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = pNode->Data.Profile.cPeriods - cPrevPeriods;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMRATIOU32 Prev = pNode->Data.RatioU32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.RatioU32 = *(PSTAMRATIOU32)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iDeltaA = pNode->Data.RatioU32.u32A - Prev.u32A;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iDeltaB = pNode->Data.RatioU32.u32B - Prev.u32B;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDeltaA == 0 && iDeltaB == 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDeltaA >= 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDeltaA + (iDeltaB >= 0 ? iDeltaB : -iDeltaB);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDeltaA + (iDeltaB < 0 ? iDeltaB : -iDeltaB);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_CALLBACK:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszString = (const char *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.pStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.pStr = new QString(pszString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (*pNode->Data.pStr == pszString)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete pNode->Data.pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.pStr = new QString(pszString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint8_t uPrev = pNode->Data.u8;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u8 = *(uint8_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = (int32_t)pNode->Data.u8 - (int32_t)uPrev;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint16_t uPrev = pNode->Data.u16;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u16 = *(uint16_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = (int32_t)pNode->Data.u16 - (int32_t)uPrev;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t uPrev = pNode->Data.u32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u32 = *(uint32_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = (int64_t)pNode->Data.u32 - (int64_t)uPrev;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t uPrev = pNode->Data.u64;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->Data.u64 = *(uint64_t *)pvSample;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iDelta = pNode->Data.u64 - uPrev;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDelta || pNode->i64Delta)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->i64Delta = iDelta;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL_RESET:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync {
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync bool fPrev = pNode->Data.f;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync pNode->Data.f = *(bool *)pvSample;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync iDelta = pNode->Data.f - fPrev;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync if (iDelta || pNode->i64Delta)
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync {
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync pNode->i64Delta = iDelta;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync pNode->enmState = kDbgGuiStatsNodeState_kRefresh;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync }
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync break;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync }
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("%d\n", enmType));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ ssize_t
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::getNodePath(PCDBGGUISTATSNODE pNode, char *psz, ssize_t cch)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ssize_t off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* root - don't add it's slash! */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(cch >= 1, -1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync off = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync cch -= pNode->cchName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(cch > 0, -1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync off = getNodePath(pNode->pParent, psz, cch);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (off >= 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz[off++] = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(&psz[off], pNode->pszName, pNode->cchName + 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync off += pNode->cchName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return off;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync/*static*/ char *
71955773a7f477f9a159a491f765ba97e1f00e1avboxsyncVBoxDbgStatsModel::getNodePath2(PCDBGGUISTATSNODE pNode, char *psz, ssize_t cch)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync if (VBoxDbgStatsModel::getNodePath(pNode, psz, cch) < 0)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return NULL;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync return psz;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync}
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ bool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::isNodeAncestorOf(PCDBGGUISTATSNODE pAncestor, PCDBGGUISTATSNODE pDescendant)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (pDescendant)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pDescendant = pDescendant->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pDescendant == pAncestor)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::nextNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* descend to children. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode->papChildren[0];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* next sibling. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->iSelf + 1 < pNode->pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pParent->papChildren[pNode->iSelf + 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* ascend and advanced to a parent's sibiling. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iSelf = pParent->iSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent = pParent->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iSelf + 1 < pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pParent->papChildren[iSelf + 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::nextDataNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync do
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = nextNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( pNode
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->enmType == STAMTYPE_INVALID);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::prevNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* previous sibling's latest descendant (better expression anyone?). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->iSelf > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pParent->papChildren[pNode->iSelf - 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[pNode->cChildren - 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* ascend to the parent. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::prevDataNode(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync do
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = prevNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( pNode
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->enmType == STAMTYPE_INVALID);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createNewTree(IMachineDebugger *a_pIMachineDebugger)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createNewTree(const char *pszFilename)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#if 0
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ PDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::createDiffTree(PDBGGUISTATSNODE pTree1, PDBGGUISTATSNODE pTree2)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncPDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateCallbackHandleOutOfOrder(const char *pszName)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#if defined(VBOX_STRICT) || defined(LOG_ENABLED)
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync char szStrict[1024];
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync#endif
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We might be inserting a new node between pPrev and pNode
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * or we might be removing one or more nodes. Either case is
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * handled in the same rough way.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Might consider optimizing insertion at some later point since this
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * is a normal occurrence (dynamic statistics in PATM, IOM, MM, ++).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pszName[0] == '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_szUpdateParent[m_cchUpdateParent - 1] == '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Start with the current parent node and look for a common ancestor
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * hoping that this is faster than going from the root (saves lookup).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = m_pUpdateParent->papChildren[m_iUpdateChild];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE const pPrev = prevDataNode(pNode);
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AssertMsg(strcmp(pszName, getNodePath2(pNode, szStrict, sizeof(szStrict))), ("%s\n", szStrict));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync AssertMsg(strcmp(pszName, getNodePath2(pPrev, szStrict, sizeof(szStrict))), ("%s\n", szStrict));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync Log(("updateCallbackHandleOutOfOrder: pszName='%s' m_szUpdateParent='%s' m_cchUpdateParent=%u pNode='%s'\n",
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync pszName, m_szUpdateParent, m_cchUpdateParent, getNodePath2(pNode, szStrict, sizeof(szStrict))));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (pNode != m_pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!strncmp(pszName, m_szUpdateParent, m_cchUpdateParent))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent > pNode->cchName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent -= pNode->cchName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync Log2(("updateCallbackHandleOutOfOrder: m_szUpdateParent='%s' m_cchUpdateParent=%u, removed '/%s' (%u)\n", m_szUpdateParent, m_cchUpdateParent, pNode->pszName, __LINE__));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_szUpdateParent[m_cchUpdateParent - 1] == '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Descend until we've found/created the node pszName indicates,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * modifying m_szUpdateParent as we go along.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (pszName[m_cchUpdateParent - 1] == '/')
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Find the end of this component. */
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync const char * const pszSubName = &pszName[m_cchUpdateParent];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszEnd = strchr(pszSubName, '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pszEnd)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pszEnd = strchr(pszSubName, '\0');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cchSubName = pszEnd - pszSubName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Add the name to the path. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(&m_szUpdateParent[m_cchUpdateParent], pszSubName, cchSubName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent += cchSubName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent++] = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent < sizeof(m_szUpdateParent));
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync Log2(("updateCallbackHandleOutOfOrder: m_szUpdateParent='%s' m_cchUpdateParent=%u (%u)\n", m_szUpdateParent, m_cchUpdateParent, __LINE__));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* first child */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsert(pNode, pszSubName, cchSubName, 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(pNode, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* binary search. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iStart = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t iLast = pNode->cChildren - 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int32_t i = iStart + (iLast + 1 - iStart) / 2;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync int iDiff;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync size_t const cchCompare = RT_MIN(pNode->papChildren[i]->cchName, cchSubName);
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync iDiff = memcmp(pszSubName, pNode->papChildren[i]->pszName, cchCompare);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!iDiff)
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync iDiff = cchSubName == cchCompare ? 0 : cchSubName > cchCompare ? 1 : -1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iDiff > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iStart = i + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iStart > iLast)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsert(pNode, pszSubName, cchSubName, iStart);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(pNode, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (iDiff < 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iLast = i - 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iLast < iStart)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsert(pNode, pszSubName, cchSubName, i);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(pNode, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[i];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert( !memcmp(pszName, m_szUpdateParent, m_cchUpdateParent - 2)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pszName[m_cchUpdateParent - 1] == '\0');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Remove all the nodes between pNode and pPrev but keep all
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * of pNode's ancestors (or it'll get orphaned).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pCur = prevNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (pCur != pPrev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pAdv = prevNode(pCur); Assert(pAdv || !pPrev);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!isNodeAncestorOf(pCur, pNode))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pCur != m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroy(pCur);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pCur = pAdv;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Remove the data from all ancestors of pNode that it doesn't
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * share them pPrev.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pPrev)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pCur = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (!isNodeAncestorOf(pCur, pPrev))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resetNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pCur = pCur->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Finally, adjust the globals (szUpdateParent is one level too deep).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent > pNode->cchName + 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent -= pNode->cchName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pUpdateParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_iUpdateChild = pNode->iSelf;
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync Log2(("updateCallbackHandleOutOfOrder: m_szUpdateParent='%s' m_cchUpdateParent=%u (%u)\n", m_szUpdateParent, m_cchUpdateParent, __LINE__));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncPDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateCallbackHandleTail(const char *pszName)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Insert it at the end of the tree.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Do the same as we're doing down in createNewTreeCallback, walk from the
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * root and create whatever we need.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(*pszName == '/' && pszName[1] != '/', NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszCur = pszName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (*pszCur)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Find the end of this component. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszNext = strchr(pszCur, '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pszNext)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pszNext = strchr(pszCur, '\0');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cchCur = pszNext - pszCur;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Create it if it doesn't exist (it will be last if it exists). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !pNode->cChildren
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || strncmp(pNode->papChildren[pNode->cChildren - 1]->pszName, pszCur, cchCur)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || pNode->papChildren[pNode->cChildren - 1]->pszName[cchCur])
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsert(pNode, pszCur, pszNext - pszCur, pNode->cChildren);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(pNode, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[pNode->cChildren - 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Advance */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pszCur = *pszNext ? pszNext + 1 : pszNext;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateCallbackAdvance(PDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Advance to the next node with data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * ASSUMES a leaf *must* have data and again we're ASSUMING the sorting
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * on slash separated sub-strings.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_iUpdateChild != UINT32_MAX)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#ifdef VBOX_STRICT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE const pCorrectNext = nextDataNode(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#endif
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* descend to the first child. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent + pNode->cchName + 2 < sizeof(m_szUpdateParent));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(&m_szUpdateParent[m_cchUpdateParent], pNode->pszName, pNode->cchName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent += pNode->cchName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent++] = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[0];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (pNode->iSelf + 1 < pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* next sibling or one if its descendants. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_pUpdateParent == pParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pParent->papChildren[pNode->iSelf + 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* move up and down- / on-wards */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (;;)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* ascend */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pParent = pParent->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode == m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_iUpdateChild = UINT32_MAX;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[0] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pUpdateParent = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent > pNode->cchName + 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent -= pNode->cchName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* try advance */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->iSelf + 1 < pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pParent->papChildren[pNode->iSelf + 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync /* descend to a node containing data and finalize the globals. (ASSUMES leaf has data.) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_iUpdateChild != UINT32_MAX)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( pNode->enmType == STAMTYPE_INVALID
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->cChildren > 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode->enmState == kDbgGuiStatsNodeState_kVisible);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_cchUpdateParent + pNode->cchName + 2 < sizeof(m_szUpdateParent));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(&m_szUpdateParent[m_cchUpdateParent], pNode->pszName, pNode->cchName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent += pNode->cchName;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent++] = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[0];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode->enmType != STAMTYPE_INVALID);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_iUpdateChild = pNode->iSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pUpdateParent = pNode->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode == pCorrectNext);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* else: we're at the end */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(int)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMVISIBILITY enmVisibility, const char *pszDesc, void *pvUser)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsModelVM *pThis = (VBoxDbgStatsModelVM *)pvUser;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log3(("updateCallback: %s\n", pszName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Skip the ones which shouldn't be visible in the GUI.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (enmVisibility == STAMVISIBILITY_NOT_GUI)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The default assumption is that nothing has changed.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * For now we'll reset the model when ever something changes.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pThis->m_iUpdateChild != UINT32_MAX)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pThis->m_pUpdateParent->papChildren[pThis->m_iUpdateChild];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !strncmp(pszName, pThis->m_szUpdateParent, pThis->m_cchUpdateParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && !strcmp(pszName + pThis->m_cchUpdateParent, pNode->pszName))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* got it! */;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* insert/remove */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pThis->updateCallbackHandleOutOfOrder(pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NO_MEMORY;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* append */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pThis->updateCallbackHandleTail(pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NO_MEMORY;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Perform the update and advance to the next one.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync updateNode(pNode, enmType, pvSample, enmUnit, pszDesc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pThis->updateCallbackAdvance(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VINF_SUCCESS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updatePrepare(void)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Find the first child with data and set it up as the 'next'
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * node to be updated.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(m_pRoot->enmType == STAMTYPE_INVALID);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pFirst = nextDataNode(m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pFirst)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_iUpdateChild = pFirst->iSelf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pUpdateParent = pFirst->pParent; Assert(m_pUpdateParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent = getNodePath(m_pUpdateParent, m_szUpdateParent, sizeof(m_szUpdateParent) - 1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(m_cchUpdateParent >= 1, false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent++] = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[m_cchUpdateParent] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_iUpdateChild = UINT32_MAX;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pUpdateParent = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_szUpdateParent[0] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_cchUpdateParent = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Set the flag and signal possible layout change.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fUpdateInsertRemove = false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* emit layoutAboutToBeChanged(); - debug this, it gets stuck... */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateDone(bool a_fSuccess)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Remove any nodes following the last in the update (unless the update failed).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( a_fSuccess
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && m_iUpdateChild != UINT32_MAX)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE const pLast = prevDataNode(m_pUpdateParent->papChildren[m_iUpdateChild]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pLast)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* nuking the whole tree. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootNode(createRootNode());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_fUpdateInsertRemove = true;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ((pNode = nextNode(pLast)))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(pNode != m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync removeAndDestroy(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * We're done making layout changes (if I understood it correctly), so,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * signal this and then see what to do next. If we did too many removals
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * we'll just reset the whole shebang.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_fUpdateInsertRemove)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* emit layoutChanged(); - hrmpf, doesn't work reliably... */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync reset();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Send dataChanged events.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync * We do this here instead of from the updateCallback because it reduces
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * the clutter in that method and allow us to emit bulk signals in an
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * easier way because we can traverse the tree in a different fashion.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DBGGUISTATSSTACK Stack;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[0].pNode = m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[0].iChild = -1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (Stack.iTop >= 0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* get top element */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = Stack.a[Stack.iTop].pNode;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t iChild = ++Stack.a[Stack.iTop].iChild;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iChild < pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* push */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(Stack.iTop < (int32_t)RT_ELEMENTS(Stack.a));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[Stack.iTop].pNode = pNode->papChildren[iChild];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.a[Stack.iTop].iChild = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* pop */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Stack.iTop--;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* do the actual work. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iChild = 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (iChild < pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* skip to the first needing updating. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( iChild < pNode->cChildren
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->papChildren[iChild]->enmState != kDbgGuiStatsNodeState_kRefresh)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync iChild++;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iChild >= pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex TopLeft = createIndex(iChild, 0, pNode->papChildren[iChild]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode->papChildren[iChild]->enmState = kDbgGuiStatsNodeState_kVisible;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* any subsequent nodes that also needs refreshing? */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( ++iChild < pNode->cChildren
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->papChildren[iChild]->enmState == kDbgGuiStatsNodeState_kRefresh)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync do pNode->papChildren[iChild]->enmState = kDbgGuiStatsNodeState_kVisible;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while ( ++iChild < pNode->cChildren
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && pNode->papChildren[iChild]->enmState == kDbgGuiStatsNodeState_kRefresh);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex BottomRight = createIndex(iChild - 1, DBGGUI_STATS_COLUMNS - 1, pNode->papChildren[iChild - 1]);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* emit the refresh signal */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync emit dataChanged(TopLeft, BottomRight);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* emit the refresh signal */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync emit dataChanged(TopLeft, TopLeft);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* emit layoutChanged(); - hrmpf, doesn't work reliably... */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return m_fUpdateInsertRemove;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateStatsByPattern(const QString &a_rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* stub */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return false;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::updateStatsByIndex(QModelIndex const &a_rIndex)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo implement this based on updateStatsByPattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::resetStatsByPattern(QString const &a_rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* stub */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::resetStatsByIndex(QModelIndex const &a_rIndex, bool fSubTree /*= true*/)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PCDBGGUISTATSNODE pNode = nodeFromIndex(a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode == m_pRoot || !a_rIndex.isValid())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (fSubTree)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* everything from the root down. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resetStatsByPattern(QString());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* the node pattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szPat[1024+1024+4];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ssize_t cch = getNodePath(pNode, szPat, 1024);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturnVoid(cch >= 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* the sub-tree pattern. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (fSubTree && pNode->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char *psz = &szPat[cch];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '|';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memcpy(psz, szPat, cch);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync psz += cch;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '/';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '*';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *psz++ = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync resetStatsByPattern(szPat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQModelIndex
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::getRootIndex(void) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return createIndex(0, 0, m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::setRootNode(PDBGGUISTATSNODE a_pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pOldTree = m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRoot = a_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyTree(pOldTree);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync reset();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQt::ItemFlags
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::flags(const QModelIndex &a_rIndex) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Qt::ItemFlags fFlags = QAbstractItemModel::flags(a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return fFlags;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncint
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::columnCount(const QModelIndex &a_rParent) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync NOREF(a_rParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return DBGGUI_STATS_COLUMNS;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncint
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::rowCount(const QModelIndex &a_rParent) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = nodeFromIndex(a_rParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pParent ? pParent->cChildren : 1 /* root */;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::hasChildren(const QModelIndex &a_rParent) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = nodeFromIndex(a_rParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pParent ? pParent->cChildren > 0 : true /* root */;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQModelIndex
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::index(int iRow, int iColumn, const QModelIndex &a_rParent) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = nodeFromIndex(a_rParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( a_rParent.isValid()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || iRow
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || (unsigned)iColumn < DBGGUI_STATS_COLUMNS)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!a_rParent.isValid());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert(!iRow);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Assert((unsigned)iColumn < DBGGUI_STATS_COLUMNS);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* root */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return createIndex(0, iColumn, m_pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ((unsigned)iRow >= pParent->cChildren)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("index: iRow=%d >= cChildren=%u (iColumn=%d)\n", iRow, (unsigned)pParent->cChildren, iColumn));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex(); /* bug? */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ((unsigned)iColumn >= DBGGUI_STATS_COLUMNS)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("index: iColumn=%d (iRow=%d)\n", iColumn, iRow));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex(); /* bug? */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pChild = pParent->papChildren[iRow];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return createIndex(iRow, iColumn, pChild);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQModelIndex
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::parent(const QModelIndex &a_rChild) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pChild = nodeFromIndex(a_rChild);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pChild)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log(("parent: invalid child\n"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex(); /* bug */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pParent = pChild->pParent;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QModelIndex(); /* ultimate root */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return createIndex(pParent->iSelf, 0, pParent);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQVariant
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::headerData(int a_iSection, Qt::Orientation a_eOrientation, int a_eRole) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( a_eOrientation == Qt::Horizontal
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && a_eRole == Qt::DisplayRole)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (a_iSection)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 0: return tr("Name");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 1: return tr("Unit");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 2: return tr("Value/Times");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 3: return tr("Min");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 4: return tr("Average");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 5: return tr("Max");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 6: return tr("Total");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 7: return tr("dInt");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 8: return tr("Description");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile(DBGGUI_STATS_COLUMNS == 9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant(); /* bug */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if ( a_eOrientation == Qt::Horizontal
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync && a_eRole == Qt::TextAlignmentRole)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (a_iSection)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 0:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 1:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 2:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 3:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 4:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 5:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 6:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 7:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return (int)(Qt::AlignRight | Qt::AlignVCenter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile(DBGGUI_STATS_COLUMNS == 9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant(); /* bug */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strUnit(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pNode->enmUnit == STAMUNIT_INVALID)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return STAMR3GetUnit(pNode->enmUnit);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strValueTimes(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_COUNTER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Counter.c);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Profile.cPeriods);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync char szTmp[64];
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync char *psz = formatNumber(szTmp, pNode->Data.RatioU32.u32A);
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync size_t off = strlen(psz);
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync memcpy(sz, psz, off);
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync sz[off++] = ':';
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync strcpy(&sz[off], formatNumber(szTmp, pNode->Data.RatioU32.u32B));
31e6eca958b963f334405a9086d0bab7a974a9cavboxsync return sz;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_CALLBACK:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return *pNode->Data.pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.u8);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatHexNumber(sz, pNode->Data.u8, 2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.u16);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatHexNumber(sz, pNode->Data.u16, 4);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.u32);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatHexNumber(sz, pNode->Data.u32, 8);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.u64);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatHexNumber(sz, pNode->Data.u64, 16);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL_RESET:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync return pNode->Data.f ? "true" : "false";
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("%d\n", pNode->enmType));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_INVALID:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strMinValue(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Profile.cTicksMin);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strAvgValue(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Profile.cTicks / pNode->Data.Profile.cPeriods);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strMaxValue(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Profile.cTicksMax);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strTotalValue(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumber(sz, pNode->Data.Profile.cTicks);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ QString
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::strDeltaValue(PCDBGGUISTATSNODE pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char sz[128];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode->Data.Profile.cPeriods)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "0";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* fall thru */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_COUNTER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32_RESET:
e6a930bcc6b38f1d1c354daaa8b4d24df544b481vboxsync case STAMTYPE_U64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64_RESET:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return formatNumberSigned(sz, pNode->i64Delta);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return "";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncQVariant
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::data(const QModelIndex &a_rIndex, int a_eRole) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync unsigned iCol = a_rIndex.column();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (iCol >= DBGGUI_STATS_COLUMNS)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_eRole == Qt::DisplayRole)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = nodeFromIndex(a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (iCol)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 0:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QString(pNode->pszName);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 1:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strUnit(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 2:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strValueTimes(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 3:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strMinValue(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 4:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strAvgValue(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 5:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strMaxValue(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 6:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strTotalValue(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 7:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return strDeltaValue(pNode);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pNode->pDescStr ? QString(*pNode->pDescStr) : QString("");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile(DBGGUI_STATS_COLUMNS == 9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (a_eRole == Qt::TextAlignmentRole)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (iCol)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 0:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 1:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 2:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 3:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 4:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 5:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 6:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 7:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return (int)(Qt::AlignRight | Qt::AlignVCenter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case 8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertCompile(DBGGUI_STATS_COLUMNS == 9);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant(); /* bug */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return QVariant();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::stringifyNodeNoRecursion(PDBGGUISTATSNODE a_pNode, QString &a_rString)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Get the path, padding it to 32-chars and add it to the string.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync char szBuf[1024];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync ssize_t off = getNodePath(a_pNode, szBuf, sizeof(szBuf) - 2);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturnVoid(off >= 0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (off < 32)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync memset(&szBuf[off], ' ', 32 - off);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szBuf[32] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync off = 32;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szBuf[off++] = ' ';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync szBuf[off] = '\0';
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_rString += szBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * The following is derived from stamR3PrintOne, except
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * we print to szBuf, do no visibility checks and can skip
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * the path bit.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync switch (a_pNode->enmType)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_COUNTER:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8llu %s", a_pNode->Data.Counter.c, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_PROFILE_ADV:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint64_t u64 = a_pNode->Data.Profile.cPeriods ? a_pNode->Data.Profile.cPeriods : 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync "%8llu %s (%12llu ticks, %7llu times, max %9llu, min %7lld)",
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->Data.Profile.cTicks / u64, STAMR3GetUnit(a_pNode->enmUnit),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->Data.Profile.cTicks, a_pNode->Data.Profile.cPeriods, a_pNode->Data.Profile.cTicksMax, a_pNode->Data.Profile.cTicksMin);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_RATIO_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync "%8u:%-8u %s",
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pNode->Data.RatioU32.u32A, a_pNode->Data.RatioU32.u32B, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_CALLBACK:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pNode->Data.pStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_rString += *a_pNode->Data.pStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), " %s", STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u8, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X8_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u8, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u16, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X16_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u16, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8u %s", a_pNode->Data.u32, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X32_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8x %s", a_pNode->Data.u32, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_U64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8llu %s", a_pNode->Data.u64, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync case STAMTYPE_X64_RESET:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%8llx %s", a_pNode->Data.u64, STAMR3GetUnit(a_pNode->enmUnit));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync break;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync case STAMTYPE_BOOL_RESET:
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync RTStrPrintf(szBuf, sizeof(szBuf), "%s %s", a_pNode->Data.f ? "true " : "false ", STAMR3GetUnit(a_pNode->enmUnit));
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync break;
4d4f336b656d46f8d301603114bb99ce635aafc0vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync default:
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertMsgFailed(("enmType=%d\n", a_pNode->enmType));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_rString += szBuf;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::stringifyNode(PDBGGUISTATSNODE a_pNode, QString &a_rString)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* this node (if it has data) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pNode->enmType != STAMTYPE_INVALID)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!a_rString.isEmpty())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_rString += "\n";
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stringifyNodeNoRecursion(a_pNode, a_rString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* the children */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t const cChildren = a_pNode->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (uint32_t i = 0; i < cChildren; i++)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stringifyNode(a_pNode->papChildren[i], a_rString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::stringifyTree(QModelIndex &a_rRoot, QString &a_rString) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pRoot = a_rRoot.isValid() ? nodeFromIndex(a_rRoot) : m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stringifyNode(pRoot, a_rString);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::copyTreeToClipboard(QModelIndex &a_rRoot) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString String;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stringifyTree(a_rRoot, String);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QClipboard *pClipboard = QApplication::clipboard();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pClipboard)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pClipboard->setText(String, QClipboard::Clipboard);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ void
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::logNode(PDBGGUISTATSNODE a_pNode, bool a_fReleaseLog)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* this node (if it has data) */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pNode->enmType != STAMTYPE_INVALID)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QString SelfStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stringifyNodeNoRecursion(a_pNode, SelfStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QByteArray SelfByteArray = SelfStr.toUtf8();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_fReleaseLog)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTLogRelPrintf("%s\n", SelfByteArray.constData());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync RTLogPrintf("%s\n", SelfByteArray.constData());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* the children */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync uint32_t const cChildren = a_pNode->cChildren;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (uint32_t i = 0; i < cChildren; i++)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync logNode(a_pNode->papChildren[i], a_fReleaseLog);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModel::logTree(QModelIndex &a_rRoot, bool a_fReleaseLog) const
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pRoot = a_rRoot.isValid() ? nodeFromIndex(a_rRoot) : m_pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync logNode(pRoot, a_fReleaseLog);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l V M
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l V M
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s M o d e l V M
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::VBoxDbgStatsModelVM(VBoxDbgGui *a_pDbgGui, QString &a_rPatStr, QObject *a_pParent)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : VBoxDbgStatsModel(a_pParent), VBoxDbgBase(a_pDbgGui)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create a model containing the STAM entries matching the pattern.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * (The original idea was to get everything and rely on some hide/visible
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * flag that it turned out didn't exist.)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pTree = createNewTree(a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootNode(pTree);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::~VBoxDbgStatsModelVM()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* nothing to do here. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncbool
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::updateStatsByPattern(const QString &a_rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /** @todo the way we update this stuff is independent of the source (XML, file, STAM), our only
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * ASSUMPTION is that the input is strictly ordered by (fully slashed) name. So, all this stuff
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * should really move up into the parent class. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync bool fRc = updatePrepare();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (fRc)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = stamEnum(a_rPatStr, updateCallback, this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync fRc = updateDone(RT_SUCCESS(rc));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return fRc;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::resetStatsByPattern(QString const &a_rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync stamReset(a_rPatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*static*/ DECLCALLBACK(int)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::createNewTreeCallback(const char *pszName, STAMTYPE enmType, void *pvSample, STAMUNIT enmUnit,
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync STAMVISIBILITY enmVisibility, const char *pszDesc, void *pvUser)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pRoot = (PDBGGUISTATSNODE)pvUser;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Log3(("createNewTreeCallback: %s\n", pszName));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Skip the ones which shouldn't be visible in the GUI.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (enmVisibility == STAMVISIBILITY_NOT_GUI)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return 0;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Perform a mkdir -p like operation till we've walked / created the entire path down
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * to the node specfied node. Remember the last node as that will be the one we will
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * stuff the data into.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync AssertReturn(*pszName == '/' && pszName[1] != '/', VERR_INTERNAL_ERROR);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pNode = pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszCur = pszName + 1;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync while (*pszCur)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* find the end of this component. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync const char *pszNext = strchr(pszCur, '/');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pszNext)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pszNext = strchr(pszCur, '\0');
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync size_t cchCur = pszNext - pszCur;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Create it if it doesn't exist (it will be last if it exists). */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ( !pNode->cChildren
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || strncmp(pNode->papChildren[pNode->cChildren - 1]->pszName, pszCur, cchCur)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync || pNode->papChildren[pNode->cChildren - 1]->pszName[cchCur])
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = createAndInsertNode(pNode, pszCur, pszNext - pszCur, UINT32_MAX);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!pNode)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return VERR_NO_MEMORY;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pNode = pNode->papChildren[pNode->cChildren - 1];
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* Advance */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pszCur = *pszNext ? pszNext + 1 : pszNext;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Save the data.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return initNode(pNode, enmType, pvSample, enmUnit, pszDesc);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncPDBGGUISTATSNODE
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsModelVM::createNewTree(QString &a_rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync PDBGGUISTATSNODE pRoot = createRootNode();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pRoot)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int rc = stamEnum(a_rPatStr, createNewTreeCallback, pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (RT_SUCCESS(rc))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return pRoot;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* failed, cleanup. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync destroyTree(pRoot);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync return NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s V i e w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s V i e w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s V i e w
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::VBoxDbgStatsView(VBoxDbgGui *a_pDbgGui, VBoxDbgStatsModel *a_pModel, VBoxDbgStats *a_pParent/* = NULL*/)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : QTreeView(a_pParent), VBoxDbgBase(a_pDbgGui), m_pModel(a_pModel), m_PatStr(), m_pParent(a_pParent),
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu(NULL), m_pBranchMenu(NULL), m_pViewMenu(NULL), m_pCurMenu(NULL), m_CurIndex()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Set the model and view defaults.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootIsDecorated(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setModel(m_pModel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex RootIdx = m_pModel->getRootIndex(); /* This should really be QModelIndex(), but Qt on darwin does wrong things then. */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootIndex(RootIdx);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setItemsExpandable(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setAlternatingRowColors(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setSelectionBehavior(SelectRows);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setSelectionMode(SingleSelection);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /// @todo sorting setSortingEnabled(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create and setup the actions.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pExpandAct = new QAction("Expand Tree", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCollapseAct = new QAction("Collapse Tree", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct = new QAction("&Refresh", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pResetAct = new QAction("Rese&t", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCopyAct = new QAction("&Copy", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pToLogAct = new QAction("To &Log", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pToRelLogAct = new QAction("T&o Release Log", this);
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync m_pAdjColumns = new QAction("&Adjust Columns", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCopyAct->setShortcut(QKeySequence::Copy);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pExpandAct->setShortcut(QKeySequence("Ctrl+E"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCollapseAct->setShortcut(QKeySequence("Ctrl+D"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct->setShortcut(QKeySequence("Ctrl+R"));
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync m_pResetAct->setShortcut(QKeySequence("Alt+R"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pToLogAct->setShortcut(QKeySequence("Ctrl+Z"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pToRelLogAct->setShortcut(QKeySequence("Alt+Z"));
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync m_pAdjColumns->setShortcut(QKeySequence("Ctrl+A"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pCopyAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pExpandAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pCollapseAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pRefreshAct);
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync addAction(m_pResetAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pToLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pToRelLogAct);
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync addAction(m_pAdjColumns);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pExpandAct, SIGNAL(triggered(bool)), this, SLOT(actExpand()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pCollapseAct, SIGNAL(triggered(bool)), this, SLOT(actCollapse()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pRefreshAct, SIGNAL(triggered(bool)), this, SLOT(actRefresh()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pResetAct, SIGNAL(triggered(bool)), this, SLOT(actReset()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pCopyAct, SIGNAL(triggered(bool)), this, SLOT(actCopy()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pToLogAct, SIGNAL(triggered(bool)), this, SLOT(actToLog()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pToRelLogAct, SIGNAL(triggered(bool)), this, SLOT(actToRelLog()));
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync connect(m_pAdjColumns, SIGNAL(triggered(bool)), this, SLOT(actAdjColumns()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create the menus and populate them.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setContextMenuPolicy(Qt::DefaultContextMenu);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu = new QMenu();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu->addAction(m_pCopyAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu->addAction(m_pRefreshAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu->addAction(m_pResetAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu->addAction(m_pToLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pLeafMenu->addAction(m_pToRelLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu = new QMenu(this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pCopyAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pRefreshAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pResetAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pToLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pToRelLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addSeparator();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pExpandAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pBranchMenu->addAction(m_pCollapseAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu = new QMenu();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pCopyAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pRefreshAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pResetAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pToLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pToRelLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addSeparator();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pExpandAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addAction(m_pCollapseAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->addSeparator();
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync m_pViewMenu->addAction(m_pAdjColumns);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /* the header menu */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QHeaderView *pHdrView = header();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHdrView->setContextMenuPolicy(Qt::CustomContextMenu);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(pHdrView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(headerContextMenuRequested(const QPoint &)));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::~VBoxDbgStatsView()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pParent = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCurMenu = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_CurIndex = QModelIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#define DELETE_IT(m) if (m) { delete m; m = NULL; } else do {} while (0)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pModel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pLeafMenu);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pBranchMenu);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pViewMenu);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pExpandAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pCollapseAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pRefreshAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pResetAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pCopyAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pToLogAct);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync DELETE_IT(m_pToRelLogAct);
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync DELETE_IT(m_pAdjColumns);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync#undef DELETE_IT
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::updateStats(const QString &rPatStr)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_PatStr = rPatStr;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pModel->updateStatsByPattern(rPatStr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootIndex(m_pModel->getRootIndex()); /* hack */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
f4579b5474998fc38afbbfc31c53609219d526a8vboxsyncvoid
f4579b5474998fc38afbbfc31c53609219d526a8vboxsyncVBoxDbgStatsView::resizeColumnsToContent()
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync{
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync for (int i = 0; i <= 8; i++)
37cdd9fa67b42ac9ef00ab4bf01da37aa5fa1440vboxsync {
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync resizeColumnToContents(i);
37cdd9fa67b42ac9ef00ab4bf01da37aa5fa1440vboxsync /* Some extra room for distinguishing numbers better in Value, Min, Avg, Max, Total, dInt columns. */
37cdd9fa67b42ac9ef00ab4bf01da37aa5fa1440vboxsync if (i >= 2 && i <= 7)
37cdd9fa67b42ac9ef00ab4bf01da37aa5fa1440vboxsync setColumnWidth(i, columnWidth(i) + 10);
37cdd9fa67b42ac9ef00ab4bf01da37aa5fa1440vboxsync }
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync}
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::setSubTreeExpanded(QModelIndex const &a_rIndex, bool a_fExpanded)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync int cRows = m_pModel->rowCount(a_rIndex);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync for (int i = 0; i < cRows; i++)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setSubTreeExpanded(a_rIndex.child(i, 0), a_fExpanded);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setExpanded(a_rIndex, a_fExpanded);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::contextMenuEvent(QContextMenuEvent *a_pEvt)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Get the selected item.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * If it's a mouse event select the item under the cursor (if any).
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (a_pEvt->reason() == QContextMenuEvent::Mouse)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Idx = indexAt(a_pEvt->pos());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Idx.isValid())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setCurrentIndex(Idx);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndexList SelIdx = selectedIndexes();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!SelIdx.isEmpty())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync Idx = SelIdx.at(0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Popup the corresponding menu.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QMenu *pMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!Idx.isValid())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pMenu = m_pViewMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else if (m_pModel->hasChildren(Idx))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pMenu = m_pBranchMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pMenu = m_pLeafMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (pMenu)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct->setEnabled(!Idx.isValid() || Idx == m_pModel->getRootIndex());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_CurIndex = Idx;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCurMenu = pMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pMenu->exec(a_pEvt->globalPos());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCurMenu = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_CurIndex = QModelIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pRefreshAct)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct->setEnabled(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pEvt->accept();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::headerContextMenuRequested(const QPoint &a_rPos)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Show the view menu.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pViewMenu)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct->setEnabled(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_CurIndex = m_pModel->getRootIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCurMenu = m_pViewMenu;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pViewMenu->exec(header()->mapToGlobal(a_rPos));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pCurMenu = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_CurIndex = QModelIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pRefreshAct)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pRefreshAct->setEnabled(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actExpand()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Idx.isValid())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setSubTreeExpanded(Idx, true /* a_fExpanded */);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actCollapse()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (Idx.isValid())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setSubTreeExpanded(Idx, false /* a_fExpanded */);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actRefresh()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!Idx.isValid() || Idx == m_pModel->getRootIndex())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pModel->updateStatsByPattern(m_PatStr))
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRootIndex(m_pModel->getRootIndex()); /* hack */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->updateStatsByIndex(Idx);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actReset()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!Idx.isValid() || Idx == m_pModel->getRootIndex())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->resetStatsByPattern(m_PatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->resetStatsByIndex(Idx);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actCopy()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->copyTreeToClipboard(Idx);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actToLog()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->logTree(Idx, false /* a_fReleaseLog */);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStatsView::actToRelLog()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QModelIndex Idx = m_pCurMenu ? m_CurIndex : currentIndex();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pModel->logTree(Idx, true /* a_fReleaseLog */);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
f4579b5474998fc38afbbfc31c53609219d526a8vboxsyncvoid
f4579b5474998fc38afbbfc31c53609219d526a8vboxsyncVBoxDbgStatsView::actAdjColumns()
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync{
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync resizeColumnsToContent();
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync}
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync/*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * V B o x D b g S t a t s
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync *
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::VBoxDbgStats(VBoxDbgGui *a_pDbgGui, const char *pszPat/* = NULL*/, unsigned uRefreshRate/* = 0*/, QWidget *pParent/* = NULL*/)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync : VBoxDbgBaseWindow(a_pDbgGui, pParent), m_PatStr(pszPat), m_pPatCB(NULL), m_uRefreshRate(0), m_pTimer(NULL), m_pView(NULL)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync /* Assign window-title: */
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync if (parent())
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync {
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync setWindowTitle(QString("%1 - Statistics").arg(parentWidget()->windowTitle()));
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync parent()->installEventFilter(this);
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync }
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync else
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync setWindowTitle("VBoxDbg - Statistics");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * On top, a horizontal box with the pattern field, buttons and refresh interval.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QHBoxLayout *pHLayout = new QHBoxLayout;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QLabel *pLabel = new QLabel(" Pattern ");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHLayout->addWidget(pLabel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setMaximumSize(pLabel->sizeHint());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB = new QComboBox();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB->setAutoCompletion(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHLayout->addWidget(m_pPatCB);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_PatStr.isEmpty())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB->addItem(m_PatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB->setDuplicatesEnabled(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB->setEditable(true);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pPatCB, SIGNAL(activated(const QString &)), this, SLOT(apply(const QString &)));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QPushButton *pPB = new QPushButton("&All");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHLayout->addWidget(pPB);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pPB->setMaximumSize(pPB->sizeHint());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(pPB, SIGNAL(clicked()), this, SLOT(applyAll()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel = new QLabel(" Interval ");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHLayout->addWidget(pLabel);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setMaximumSize(pLabel->sizeHint());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QSpinBox *pSB = new QSpinBox();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHLayout->addWidget(pSB);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setMinimum(0);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setMaximum(60);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setSingleStep(1);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setValue(uRefreshRate);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setSuffix(" s");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setWrapping(false);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setButtonSymbols(QSpinBox::PlusMinus);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pSB->setMaximumSize(pSB->sizeHint());
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(pSB, SIGNAL(valueChanged(int)), this, SLOT(setRefresh(int)));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create the tree view and setup the layout.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync VBoxDbgStatsModelVM *pModel = new VBoxDbgStatsModelVM(a_pDbgGui, m_PatStr, NULL);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pView = new VBoxDbgStatsView(a_pDbgGui, pModel, this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QWidget *pHBox = new QWidget;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pHBox->setLayout(pHLayout);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync QVBoxLayout *pVLayout = new QVBoxLayout;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->addWidget(pHBox);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync pVLayout->addWidget(m_pView);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setLayout(pVLayout);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Resize the columns.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Seems this has to be done with all nodes expanded.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pView->expandAll();
f4579b5474998fc38afbbfc31c53609219d526a8vboxsync m_pView->resizeColumnsToContent();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pView->collapseAll();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * Create a refresh timer and start it.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer = new QTimer(this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pTimer, SIGNAL(timeout()), this, SLOT(refresh()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync setRefresh(uRefreshRate);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync /*
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync * And some shortcuts.
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync */
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToPat = new QAction("", this);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pFocusToPat->setShortcut(QKeySequence("Ctrl+L"));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync addAction(m_pFocusToPat);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync connect(m_pFocusToPat, SIGNAL(triggered(bool)), this, SLOT(actFocusToPat()));
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::~VBoxDbgStats()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pTimer)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pTimer;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pPatCB)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pPatCB;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (m_pView)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete m_pView;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pView = NULL;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::closeEvent(QCloseEvent *a_pCloseEvt)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync a_pCloseEvt->accept();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync delete this;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsyncbool VBoxDbgStats::eventFilter(QObject *pWatched, QEvent *pEvent)
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync{
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync /* Skip events which are not related to our parent: */
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync if (pWatched != parent())
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync return VBoxDbgBaseWindow::eventFilter(pWatched, pEvent);
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync /* Depending on event-type: */
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync switch (pEvent->type())
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync {
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync case QEvent::WindowTitleChange: setWindowTitle(QString("%1 - Statistics").arg(parentWidget()->windowTitle())); break;
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync default: break;
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync }
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync /* Call to base-class: */
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync return VBoxDbgBaseWindow::eventFilter(pWatched, pEvent);
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync}
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync
78b53d2559005e2deb0fd645a8ae539b25810b9dvboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::apply(const QString &Str)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_PatStr = Str;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync refresh();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::applyAll()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync apply("");
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::refresh()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pView->updateStats(m_PatStr);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::setRefresh(int iRefresh)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if ((unsigned)iRefresh != m_uRefreshRate)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync {
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_uRefreshRate || iRefresh)
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer->start(iRefresh * 1000);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync else
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pTimer->stop();
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_uRefreshRate = iRefresh;
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync }
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncvoid
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsyncVBoxDbgStats::actFocusToPat()
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync{
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync if (!m_pPatCB->hasFocus())
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync m_pPatCB->setFocus(Qt::ShortcutFocusReason);
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync}
a33af978add1a03aab11b2895f441af5cb2a11a6vboxsync