PerformanceImpl.h revision c7a378ed2fbad681c0b674351d698ef20a368935
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* $Id$ */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** @file
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VBox Performance COM class implementation.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Copyright (C) 2008-2009 Oracle Corporation
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * available from http://www.virtualbox.org. This file is free software;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * General Public License (GPL) as published by the Free Software
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#ifndef ____H_PERFORMANCEIMPL
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#define ____H_PERFORMANCEIMPL
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#include "VirtualBoxBase.h"
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#include <VBox/com/com.h>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#include <VBox/com/array.h>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync//#ifdef VBOX_WITH_RESOURCE_USAGE_API
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#include <iprt/timer.h>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync//#endif /* VBOX_WITH_RESOURCE_USAGE_API */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#include <list>
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncnamespace pm
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync class Metric;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync class BaseMetric;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync class CollectorHAL;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync}
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#undef min
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#undef max
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* Each second we obtain new CPU load stats. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#define VBOX_USAGE_SAMPLER_MIN_INTERVAL 1000
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncclass HostUSBDevice;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncclass ATL_NO_VTABLE PerformanceMetric :
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync public VirtualBoxBase,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VBOX_SCRIPTABLE_IMPL(IPerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncpublic:
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceMetric, IPerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DECLARE_NOT_AGGREGATABLE (PerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BEGIN_COM_MAP (PerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES (IPerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync END_COM_MAP()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DECLARE_EMPTY_CTOR_DTOR (PerformanceMetric)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync HRESULT FinalConstruct();
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync void FinalRelease();
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // public initializer/uninitializer for internal purposes only
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync HRESULT init (pm::Metric *aMetric);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync HRESULT init (pm::BaseMetric *aMetric);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync void uninit();
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // IPerformanceMetric properties
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(MetricName)) (BSTR *aMetricName);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(Object)) (IUnknown **anObject);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(Period)) (ULONG *aPeriod);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(Count)) (ULONG *aCount);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(Unit)) (BSTR *aUnit);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(MinimumValue)) (LONG *aMinValue);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync STDMETHOD(COMGETTER(MaximumValue)) (LONG *aMaxValue);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // IPerformanceMetric methods
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // public methods only for internal purposes
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // public methods for internal purposes only
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync // (ensure there is a caller and a read lock before calling them!)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncprivate:
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync struct Data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync {
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* Constructor. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync : period(0), count(0), min(0), max(0)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync {
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync }
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Bstr name;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ComPtr<IUnknown> object;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Bstr description;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ULONG period;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync ULONG count;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Bstr unit;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LONG min;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LONG max;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync };
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync Data m;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync};
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncclass ATL_NO_VTABLE PerformanceCollector :
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync public VirtualBoxBase,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VBOX_SCRIPTABLE_IMPL(IPerformanceCollector)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync{
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncpublic:
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceCollector, IPerformanceCollector)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DECLARE_NOT_AGGREGATABLE (PerformanceCollector)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync BEGIN_COM_MAP(PerformanceCollector)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES(IPerformanceCollector)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync END_COM_MAP()
DECLARE_EMPTY_CTOR_DTOR (PerformanceCollector)
HRESULT FinalConstruct();
void FinalRelease();
// public initializers/uninitializers only for internal purposes
HRESULT init();
void uninit();
// IPerformanceCollector properties
STDMETHOD(COMGETTER(MetricNames)) (ComSafeArrayOut (BSTR, metricNames));
// IPerformanceCollector methods
STDMETHOD(GetMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
ComSafeArrayIn (IUnknown *, objects),
ComSafeArrayOut (IPerformanceMetric *, outMetrics));
STDMETHOD(SetupMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
ComSafeArrayIn (IUnknown *, objects),
ULONG aPeriod, ULONG aCount,
ComSafeArrayOut (IPerformanceMetric *,
outMetrics));
STDMETHOD(EnableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
ComSafeArrayIn (IUnknown *, objects),
ComSafeArrayOut (IPerformanceMetric *,
outMetrics));
STDMETHOD(DisableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
ComSafeArrayIn (IUnknown *, objects),
ComSafeArrayOut (IPerformanceMetric *,
outMetrics));
STDMETHOD(QueryMetricsData) (ComSafeArrayIn (IN_BSTR, metricNames),
ComSafeArrayIn (IUnknown *, objects),
ComSafeArrayOut (BSTR, outMetricNames),
ComSafeArrayOut (IUnknown *, outObjects),
ComSafeArrayOut (BSTR, outUnits),
ComSafeArrayOut (ULONG, outScales),
ComSafeArrayOut (ULONG, outSequenceNumbers),
ComSafeArrayOut (ULONG, outDataIndices),
ComSafeArrayOut (ULONG, outDataLengths),
ComSafeArrayOut (LONG, outData));
// public methods only for internal purposes
void registerBaseMetric (pm::BaseMetric *baseMetric);
void registerMetric (pm::Metric *metric);
void unregisterBaseMetricsFor (const ComPtr<IUnknown> &object);
void unregisterMetricsFor (const ComPtr<IUnknown> &object);
void suspendSampling();
void resumeSampling();
// public methods for internal purposes only
// (ensure there is a caller and a read lock before calling them!)
pm::CollectorHAL *getHAL() { return m.hal; };
private:
HRESULT toIPerformanceMetric(pm::Metric *src, IPerformanceMetric **dst);
HRESULT toIPerformanceMetric(pm::BaseMetric *src, IPerformanceMetric **dst);
static void staticSamplerCallback (RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
void samplerCallback(uint64_t iTick);
typedef std::list<pm::Metric*> MetricList;
typedef std::list<pm::BaseMetric*> BaseMetricList;
enum
{
MAGIC = 0xABBA1972u
};
unsigned int mMagic;
struct Data
{
Data() : hal(0) {};
BaseMetricList baseMetrics;
MetricList metrics;
RTTIMERLR sampler;
pm::CollectorHAL *hal;
};
Data m;
};
#endif //!____H_PERFORMANCEIMPL
/* vi: set tabstop=4 shiftwidth=4 expandtab: */