VirtualBox

source: vbox/trunk/src/VBox/Main/include/PerformanceImpl.h@ 40358

Last change on this file since 40358 was 40358, checked in by vboxsync, 13 years ago

Main/Metrics: All calls to VM processes are done in separate thread (#6029)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.0 KB
Line 
1/* $Id: PerformanceImpl.h 40358 2012-03-05 14:40:52Z vboxsync $ */
2
3/** @file
4 *
5 * VBox Performance COM class implementation.
6 */
7
8/*
9 * Copyright (C) 2008-2009 Oracle Corporation
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 */
19
20#ifndef ____H_PERFORMANCEIMPL
21#define ____H_PERFORMANCEIMPL
22
23#include "VirtualBoxBase.h"
24
25#include <VBox/com/com.h>
26#include <VBox/com/array.h>
27//#ifdef VBOX_WITH_RESOURCE_USAGE_API
28#include <iprt/timer.h>
29//#endif /* VBOX_WITH_RESOURCE_USAGE_API */
30
31#include <list>
32
33namespace pm
34{
35 class Metric;
36 class BaseMetric;
37 class CollectorHAL;
38 class CollectorGuest;
39 class CollectorGuestManager;
40}
41
42#undef min
43#undef max
44
45/* Each second we obtain new CPU load stats. */
46#define VBOX_USAGE_SAMPLER_MIN_INTERVAL 1000
47
48class HostUSBDevice;
49
50class ATL_NO_VTABLE PerformanceMetric :
51 public VirtualBoxBase,
52 VBOX_SCRIPTABLE_IMPL(IPerformanceMetric)
53{
54public:
55 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceMetric, IPerformanceMetric)
56
57 DECLARE_NOT_AGGREGATABLE (PerformanceMetric)
58
59 DECLARE_PROTECT_FINAL_CONSTRUCT()
60
61 BEGIN_COM_MAP (PerformanceMetric)
62 VBOX_DEFAULT_INTERFACE_ENTRIES (IPerformanceMetric)
63 END_COM_MAP()
64
65 DECLARE_EMPTY_CTOR_DTOR (PerformanceMetric)
66
67 HRESULT FinalConstruct();
68 void FinalRelease();
69
70 // public initializer/uninitializer for internal purposes only
71 HRESULT init (pm::Metric *aMetric);
72 HRESULT init (pm::BaseMetric *aMetric);
73 void uninit();
74
75 // IPerformanceMetric properties
76 STDMETHOD(COMGETTER(MetricName)) (BSTR *aMetricName);
77 STDMETHOD(COMGETTER(Object)) (IUnknown **anObject);
78 STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
79 STDMETHOD(COMGETTER(Period)) (ULONG *aPeriod);
80 STDMETHOD(COMGETTER(Count)) (ULONG *aCount);
81 STDMETHOD(COMGETTER(Unit)) (BSTR *aUnit);
82 STDMETHOD(COMGETTER(MinimumValue)) (LONG *aMinValue);
83 STDMETHOD(COMGETTER(MaximumValue)) (LONG *aMaxValue);
84
85 // IPerformanceMetric methods
86
87 // public methods only for internal purposes
88
89 // public methods for internal purposes only
90 // (ensure there is a caller and a read lock before calling them!)
91
92private:
93
94 struct Data
95 {
96 /* Constructor. */
97 Data()
98 : period(0), count(0), min(0), max(0)
99 {
100 }
101
102 Bstr name;
103 ComPtr<IUnknown> object;
104 Bstr description;
105 ULONG period;
106 ULONG count;
107 Bstr unit;
108 LONG min;
109 LONG max;
110 };
111
112 Data m;
113};
114
115
116class ATL_NO_VTABLE PerformanceCollector :
117 public VirtualBoxBase,
118 VBOX_SCRIPTABLE_IMPL(IPerformanceCollector)
119{
120public:
121
122 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(PerformanceCollector, IPerformanceCollector)
123
124 DECLARE_NOT_AGGREGATABLE (PerformanceCollector)
125
126 DECLARE_PROTECT_FINAL_CONSTRUCT()
127
128 BEGIN_COM_MAP(PerformanceCollector)
129 VBOX_DEFAULT_INTERFACE_ENTRIES(IPerformanceCollector)
130 END_COM_MAP()
131
132 DECLARE_EMPTY_CTOR_DTOR (PerformanceCollector)
133
134 HRESULT FinalConstruct();
135 void FinalRelease();
136
137 // public initializers/uninitializers only for internal purposes
138 HRESULT init();
139 void uninit();
140
141 // IPerformanceCollector properties
142 STDMETHOD(COMGETTER(MetricNames)) (ComSafeArrayOut (BSTR, metricNames));
143
144 // IPerformanceCollector methods
145 STDMETHOD(GetMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
146 ComSafeArrayIn (IUnknown *, objects),
147 ComSafeArrayOut (IPerformanceMetric *, outMetrics));
148 STDMETHOD(SetupMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
149 ComSafeArrayIn (IUnknown *, objects),
150 ULONG aPeriod, ULONG aCount,
151 ComSafeArrayOut (IPerformanceMetric *,
152 outMetrics));
153 STDMETHOD(EnableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
154 ComSafeArrayIn (IUnknown *, objects),
155 ComSafeArrayOut (IPerformanceMetric *,
156 outMetrics));
157 STDMETHOD(DisableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
158 ComSafeArrayIn (IUnknown *, objects),
159 ComSafeArrayOut (IPerformanceMetric *,
160 outMetrics));
161 STDMETHOD(QueryMetricsData) (ComSafeArrayIn (IN_BSTR, metricNames),
162 ComSafeArrayIn (IUnknown *, objects),
163 ComSafeArrayOut (BSTR, outMetricNames),
164 ComSafeArrayOut (IUnknown *, outObjects),
165 ComSafeArrayOut (BSTR, outUnits),
166 ComSafeArrayOut (ULONG, outScales),
167 ComSafeArrayOut (ULONG, outSequenceNumbers),
168 ComSafeArrayOut (ULONG, outDataIndices),
169 ComSafeArrayOut (ULONG, outDataLengths),
170 ComSafeArrayOut (LONG, outData));
171
172 // public methods only for internal purposes
173
174 void registerBaseMetric (pm::BaseMetric *baseMetric);
175 void registerMetric (pm::Metric *metric);
176 void unregisterBaseMetricsFor (const ComPtr<IUnknown> &object);
177 void unregisterMetricsFor (const ComPtr<IUnknown> &object);
178 void registerGuest(pm::CollectorGuest* pGuest);
179 void unregisterGuest(pm::CollectorGuest* pGuest);
180
181 void suspendSampling();
182 void resumeSampling();
183
184 // public methods for internal purposes only
185 // (ensure there is a caller and a read lock before calling them!)
186
187 pm::CollectorHAL *getHAL() { return m.hal; };
188 pm::CollectorGuestManager *getGuestManager() { return m.gm; };
189
190private:
191 HRESULT toIPerformanceMetric(pm::Metric *src, IPerformanceMetric **dst);
192 HRESULT toIPerformanceMetric(pm::BaseMetric *src, IPerformanceMetric **dst);
193
194 static void staticSamplerCallback (RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
195 void samplerCallback(uint64_t iTick);
196
197 const Utf8Str& getFailedGuestName();
198
199 typedef std::list<pm::Metric*> MetricList;
200 typedef std::list<pm::BaseMetric*> BaseMetricList;
201
202 enum
203 {
204 MAGIC = 0xABBA1972u
205 };
206
207 unsigned int mMagic;
208 const Utf8Str mUnknownGuest;
209
210 struct Data
211 {
212 Data() : hal(0) {};
213
214 BaseMetricList baseMetrics;
215 MetricList metrics;
216 RTTIMERLR sampler;
217 pm::CollectorHAL *hal;
218 pm::CollectorGuestManager *gm;
219 };
220
221 Data m;
222};
223
224#endif //!____H_PERFORMANCEIMPL
225/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette