05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/* $Id$ */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/** @file
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync *
1c898140fdfb6f3d207b0066f4fc8988226da7d4vboxsync * VBox Performance COM class implementation.
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2008-2012 Oracle Corporation
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync *
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * available from http://www.virtualbox.org. This file is free software;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * you can redistribute it and/or modify it under the terms of the GNU
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * General Public License (GPL) as published by the Free Software
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#ifndef ____H_PERFORMANCEIMPL
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#define ____H_PERFORMANCEIMPL
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#include "VirtualBoxBase.h"
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
4651430e55b9df9726347e3e3968618e540fe729vboxsync#include <VBox/com/com.h>
4651430e55b9df9726347e3e3968618e540fe729vboxsync#include <VBox/com/array.h>
4651430e55b9df9726347e3e3968618e540fe729vboxsync//#ifdef VBOX_WITH_RESOURCE_USAGE_API
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#include <iprt/timer.h>
4651430e55b9df9726347e3e3968618e540fe729vboxsync//#endif /* VBOX_WITH_RESOURCE_USAGE_API */
4651430e55b9df9726347e3e3968618e540fe729vboxsync
4651430e55b9df9726347e3e3968618e540fe729vboxsync#include <list>
4651430e55b9df9726347e3e3968618e540fe729vboxsync
4651430e55b9df9726347e3e3968618e540fe729vboxsyncnamespace pm
4651430e55b9df9726347e3e3968618e540fe729vboxsync{
4651430e55b9df9726347e3e3968618e540fe729vboxsync class Metric;
4651430e55b9df9726347e3e3968618e540fe729vboxsync class BaseMetric;
4651430e55b9df9726347e3e3968618e540fe729vboxsync class CollectorHAL;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync class CollectorGuest;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync class CollectorGuestManager;
4651430e55b9df9726347e3e3968618e540fe729vboxsync}
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
5ff3fa0492332325f57e80636321619e2224027evboxsync#undef min
5ff3fa0492332325f57e80636321619e2224027evboxsync#undef max
5ff3fa0492332325f57e80636321619e2224027evboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/* Each second we obtain new CPU load stats. */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#define VBOX_USAGE_SAMPLER_MIN_INTERVAL 1000
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
4651430e55b9df9726347e3e3968618e540fe729vboxsyncclass HostUSBDevice;
4651430e55b9df9726347e3e3968618e540fe729vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncclass ATL_NO_VTABLE PerformanceMetric :
f32de6c198a491c28ace2b4c53f8d04a79fd6d69vboxsync public VirtualBoxBase,
0ce6ae9d6efed5d54222a13bbdabce9e688e4447vboxsync VBOX_SCRIPTABLE_IMPL(IPerformanceMetric)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync{
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncpublic:
e07acfb7f2dbb8bb40804024c79fd3139bdb3f24vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceMetric, IPerformanceMetric)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_NOT_AGGREGATABLE (PerformanceMetric)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync BEGIN_COM_MAP (PerformanceMetric)
c7a378ed2fbad681c0b674351d698ef20a368935vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES (IPerformanceMetric)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync END_COM_MAP()
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_EMPTY_CTOR_DTOR (PerformanceMetric)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync HRESULT FinalConstruct();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void FinalRelease();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public initializer/uninitializer for internal purposes only
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync HRESULT init (pm::Metric *aMetric);
df4af4b66b5f26c3c06ae1592ec2e67afd82dd0cvboxsync HRESULT init (pm::BaseMetric *aMetric);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void uninit();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // IPerformanceMetric properties
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync STDMETHOD(COMGETTER(MetricName)) (BSTR *aMetricName);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync STDMETHOD(COMGETTER(Object)) (IUnknown **anObject);
83c86878d483df62ca8db465c671995984838338vboxsync STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync STDMETHOD(COMGETTER(Period)) (ULONG *aPeriod);
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync STDMETHOD(COMGETTER(Count)) (ULONG *aCount);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync STDMETHOD(COMGETTER(Unit)) (BSTR *aUnit);
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync STDMETHOD(COMGETTER(MinimumValue)) (LONG *aMinValue);
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync STDMETHOD(COMGETTER(MaximumValue)) (LONG *aMaxValue);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // IPerformanceMetric methods
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public methods only for internal purposes
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public methods for internal purposes only
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // (ensure there is a caller and a read lock before calling them!)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncprivate:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync struct Data
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync {
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync /* Constructor. */
5ff3fa0492332325f57e80636321619e2224027evboxsync Data()
5ff3fa0492332325f57e80636321619e2224027evboxsync : period(0), count(0), min(0), max(0)
5ff3fa0492332325f57e80636321619e2224027evboxsync {
5ff3fa0492332325f57e80636321619e2224027evboxsync }
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync Bstr name;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync ComPtr<IUnknown> object;
83c86878d483df62ca8db465c671995984838338vboxsync Bstr description;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync ULONG period;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync ULONG count;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync Bstr unit;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync LONG min;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync LONG max;
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync };
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync
5a6bbb9c0d896e804f267c6919f52158a420b998vboxsync Data m;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncclass ATL_NO_VTABLE PerformanceCollector :
f32de6c198a491c28ace2b4c53f8d04a79fd6d69vboxsync public VirtualBoxBase,
0ce6ae9d6efed5d54222a13bbdabce9e688e4447vboxsync VBOX_SCRIPTABLE_IMPL(IPerformanceCollector)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync{
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncpublic:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
e07acfb7f2dbb8bb40804024c79fd3139bdb3f24vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceCollector, IPerformanceCollector)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_NOT_AGGREGATABLE (PerformanceCollector)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync BEGIN_COM_MAP(PerformanceCollector)
c7a378ed2fbad681c0b674351d698ef20a368935vboxsync VBOX_DEFAULT_INTERFACE_ENTRIES(IPerformanceCollector)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync END_COM_MAP()
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync DECLARE_EMPTY_CTOR_DTOR (PerformanceCollector)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync HRESULT FinalConstruct();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void FinalRelease();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public initializers/uninitializers only for internal purposes
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync HRESULT init();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void uninit();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // IPerformanceCollector properties
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync STDMETHOD(COMGETTER(MetricNames)) (ComSafeArrayOut (BSTR, metricNames));
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // IPerformanceCollector methods
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync STDMETHOD(GetMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync ComSafeArrayIn (IUnknown *, objects),
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync ComSafeArrayOut (IPerformanceMetric *, outMetrics));
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync STDMETHOD(SetupMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync ComSafeArrayIn (IUnknown *, objects),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ULONG aPeriod, ULONG aCount,
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (IPerformanceMetric *,
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync outMetrics));
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync STDMETHOD(EnableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayIn (IUnknown *, objects),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (IPerformanceMetric *,
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync outMetrics));
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync STDMETHOD(DisableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayIn (IUnknown *, objects),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (IPerformanceMetric *,
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync outMetrics));
f72cbd6a549c34992fa79cce84600fe2b92b3299vboxsync STDMETHOD(QueryMetricsData) (ComSafeArrayIn (IN_BSTR, metricNames),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayIn (IUnknown *, objects),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayOut (BSTR, outMetricNames),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayOut (IUnknown *, outObjects),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (BSTR, outUnits),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (ULONG, outScales),
4fd4258d68911eacb0b3d1f096b778d19da4e55avboxsync ComSafeArrayOut (ULONG, outSequenceNumbers),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayOut (ULONG, outDataIndices),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayOut (ULONG, outDataLengths),
49207a1552ff3752904e36b9269f08fe643ba871vboxsync ComSafeArrayOut (LONG, outData));
49207a1552ff3752904e36b9269f08fe643ba871vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public methods only for internal purposes
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void registerBaseMetric (pm::BaseMetric *baseMetric);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void registerMetric (pm::Metric *metric);
8fb98fbc10b7eac3a486937f31fb10985a5db7d1vboxsync void unregisterBaseMetricsFor (const ComPtr<IUnknown> &object, const Utf8Str name = "*");
8fb98fbc10b7eac3a486937f31fb10985a5db7d1vboxsync void unregisterMetricsFor (const ComPtr<IUnknown> &object, const Utf8Str name = "*");
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync void registerGuest(pm::CollectorGuest* pGuest);
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync void unregisterGuest(pm::CollectorGuest* pGuest);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
9c3f21ab6ba51a44403b662e1691293ab266e5e3vboxsync void suspendSampling();
9c3f21ab6ba51a44403b662e1691293ab266e5e3vboxsync void resumeSampling();
9c3f21ab6ba51a44403b662e1691293ab266e5e3vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // public methods for internal purposes only
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // (ensure there is a caller and a read lock before calling them!)
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync pm::CollectorHAL *getHAL() { return m.hal; };
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync pm::CollectorGuestManager *getGuestManager() { return m.gm; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncprivate:
df4af4b66b5f26c3c06ae1592ec2e67afd82dd0cvboxsync HRESULT toIPerformanceMetric(pm::Metric *src, IPerformanceMetric **dst);
df4af4b66b5f26c3c06ae1592ec2e67afd82dd0cvboxsync HRESULT toIPerformanceMetric(pm::BaseMetric *src, IPerformanceMetric **dst);
d3361a18160600d3ba74c8dab5bbef532883826avboxsync
e6a899848410114df5f1db88a025d0843a98112cvboxsync static void staticSamplerCallback (RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
cbf5a4260109bea05e1492f0b375b11a738cfb1dvboxsync void samplerCallback(uint64_t iTick);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
561574402775590253d11504354bfe21d80e4858vboxsync const Utf8Str& getFailedGuestName();
561574402775590253d11504354bfe21d80e4858vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync typedef std::list<pm::Metric*> MetricList;
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync typedef std::list<pm::BaseMetric*> BaseMetricList;
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync enum
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync {
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync MAGIC = 0xABBA1972u
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned int mMagic;
561574402775590253d11504354bfe21d80e4858vboxsync const Utf8Str mUnknownGuest;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync struct Data
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync {
1f277e5b999f572b1ef1fe4ef593c603ea463be3vboxsync Data() : hal(0) {};
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync BaseMetricList baseMetrics;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync MetricList metrics;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync RTTIMERLR sampler;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync pm::CollectorHAL *hal;
0b6e534f55fcb5870df42b58ae354ad5fdbda66avboxsync pm::CollectorGuestManager *gm;
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync };
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync
615105a2b89b7dd89a76504e6a9b8e099704c0d9vboxsync Data m;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#endif //!____H_PERFORMANCEIMPL
f6adf1a86574758258baa232172c965aed0d848dvboxsync/* vi: set tabstop=4 shiftwidth=4 expandtab: */