VirtualBox

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

Last change on this file since 21525 was 21395, checked in by vboxsync, 15 years ago

Stop performance counter sampling when the host goes into suspend mode. Restart it during resume.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 KB
Line 
1/* $Id: PerformanceImpl.h 21395 2009-07-08 13:30:34Z vboxsync $ */
2
3/** @file
4 *
5 * VBox Performance COM class implementation.
6 */
7
8/*
9 * Copyright (C) 2008-2009 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24#ifndef ____H_PERFORMANCEIMPL
25#define ____H_PERFORMANCEIMPL
26
27#include "VirtualBoxBase.h"
28
29#include <VBox/com/com.h>
30#include <VBox/com/array.h>
31//#ifdef VBOX_WITH_RESOURCE_USAGE_API
32#include <iprt/timer.h>
33//#endif /* VBOX_WITH_RESOURCE_USAGE_API */
34
35#include <list>
36
37namespace pm
38{
39 class Metric;
40 class BaseMetric;
41 class CollectorHAL;
42}
43
44#undef min
45#undef max
46
47/* Each second we obtain new CPU load stats. */
48#define VBOX_USAGE_SAMPLER_MIN_INTERVAL 1000
49
50class Machine;
51class HostUSBDevice;
52
53class ATL_NO_VTABLE PerformanceMetric :
54 public VirtualBoxBaseNEXT,
55 public VirtualBoxSupportTranslation <PerformanceMetric>,
56 VBOX_SCRIPTABLE_IMPL(IPerformanceMetric)
57{
58public:
59
60 DECLARE_NOT_AGGREGATABLE (PerformanceMetric)
61
62 DECLARE_PROTECT_FINAL_CONSTRUCT()
63
64 BEGIN_COM_MAP (PerformanceMetric)
65 COM_INTERFACE_ENTRY (IPerformanceMetric)
66 COM_INTERFACE_ENTRY (IDispatch)
67 END_COM_MAP()
68
69 NS_DECL_ISUPPORTS
70
71 DECLARE_EMPTY_CTOR_DTOR (PerformanceMetric)
72
73 HRESULT FinalConstruct();
74 void FinalRelease();
75
76 // public initializer/uninitializer for internal purposes only
77 HRESULT init (pm::Metric *aMetric);
78 HRESULT init (pm::BaseMetric *aMetric);
79 void uninit();
80
81 // IPerformanceMetric properties
82 STDMETHOD(COMGETTER(MetricName)) (BSTR *aMetricName);
83 STDMETHOD(COMGETTER(Object)) (IUnknown **anObject);
84 STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
85 STDMETHOD(COMGETTER(Period)) (ULONG *aPeriod);
86 STDMETHOD(COMGETTER(Count)) (ULONG *aCount);
87 STDMETHOD(COMGETTER(Unit)) (BSTR *aUnit);
88 STDMETHOD(COMGETTER(MinimumValue)) (LONG *aMinValue);
89 STDMETHOD(COMGETTER(MaximumValue)) (LONG *aMaxValue);
90
91 // IPerformanceMetric methods
92
93 // public methods only for internal purposes
94
95 // public methods for internal purposes only
96 // (ensure there is a caller and a read lock before calling them!)
97
98private:
99
100 struct Data
101 {
102 /* Constructor. */
103 Data()
104 : period(0), count(0), min(0), max(0)
105 {
106 }
107
108 Bstr name;
109 ComPtr<IUnknown> object;
110 Bstr description;
111 ULONG period;
112 ULONG count;
113 Bstr unit;
114 LONG min;
115 LONG max;
116 };
117
118 Data m;
119};
120
121
122class ATL_NO_VTABLE PerformanceCollector :
123 public VirtualBoxBaseNEXT,
124 public VirtualBoxSupportErrorInfoImpl <PerformanceCollector, IPerformanceCollector>,
125 public VirtualBoxSupportTranslation <PerformanceCollector>,
126 VBOX_SCRIPTABLE_IMPL(IPerformanceCollector)
127{
128public:
129
130 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT (PerformanceCollector)
131
132 DECLARE_NOT_AGGREGATABLE (PerformanceCollector)
133
134 DECLARE_PROTECT_FINAL_CONSTRUCT()
135
136 BEGIN_COM_MAP(PerformanceCollector)
137 COM_INTERFACE_ENTRY(ISupportErrorInfo)
138 COM_INTERFACE_ENTRY(IPerformanceCollector)
139 COM_INTERFACE_ENTRY(IDispatch)
140 END_COM_MAP()
141
142 NS_DECL_ISUPPORTS
143
144 DECLARE_EMPTY_CTOR_DTOR (PerformanceCollector)
145
146 HRESULT FinalConstruct();
147 void FinalRelease();
148
149 // public initializers/uninitializers only for internal purposes
150 HRESULT init();
151 void uninit();
152
153 // IPerformanceCollector properties
154 STDMETHOD(COMGETTER(MetricNames)) (ComSafeArrayOut (BSTR, metricNames));
155
156 // IPerformanceCollector methods
157 STDMETHOD(GetMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
158 ComSafeArrayIn (IUnknown *, objects),
159 ComSafeArrayOut (IPerformanceMetric *, outMetrics));
160 STDMETHOD(SetupMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
161 ComSafeArrayIn (IUnknown *, objects),
162 ULONG aPeriod, ULONG aCount,
163 ComSafeArrayOut (IPerformanceMetric *,
164 outMetrics));
165 STDMETHOD(EnableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
166 ComSafeArrayIn (IUnknown *, objects),
167 ComSafeArrayOut (IPerformanceMetric *,
168 outMetrics));
169 STDMETHOD(DisableMetrics) (ComSafeArrayIn (IN_BSTR, metricNames),
170 ComSafeArrayIn (IUnknown *, objects),
171 ComSafeArrayOut (IPerformanceMetric *,
172 outMetrics));
173 STDMETHOD(QueryMetricsData) (ComSafeArrayIn (IN_BSTR, metricNames),
174 ComSafeArrayIn (IUnknown *, objects),
175 ComSafeArrayOut (BSTR, outMetricNames),
176 ComSafeArrayOut (IUnknown *, outObjects),
177 ComSafeArrayOut (BSTR, outUnits),
178 ComSafeArrayOut (ULONG, outScales),
179 ComSafeArrayOut (ULONG, outSequenceNumbers),
180 ComSafeArrayOut (ULONG, outDataIndices),
181 ComSafeArrayOut (ULONG, outDataLengths),
182 ComSafeArrayOut (LONG, outData));
183
184 // public methods only for internal purposes
185
186 void registerBaseMetric (pm::BaseMetric *baseMetric);
187 void registerMetric (pm::Metric *metric);
188 void unregisterBaseMetricsFor (const ComPtr <IUnknown> &object);
189 void unregisterMetricsFor (const ComPtr <IUnknown> &object);
190
191 void suspendSampling();
192 void resumeSampling();
193
194 // public methods for internal purposes only
195 // (ensure there is a caller and a read lock before calling them!)
196
197 pm::CollectorHAL *getHAL() { return m.hal; };
198
199 // for VirtualBoxSupportErrorInfoImpl
200 static const wchar_t *getComponentName() { return L"PerformanceCollector"; }
201
202private:
203 HRESULT toIPerformanceMetric(pm::Metric *src, IPerformanceMetric **dst);
204 HRESULT toIPerformanceMetric(pm::BaseMetric *src, IPerformanceMetric **dst);
205
206 static void staticSamplerCallback (RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
207 void samplerCallback();
208
209 typedef std::list<pm::Metric*> MetricList;
210 typedef std::list<pm::BaseMetric*> BaseMetricList;
211
212 enum
213 {
214 MAGIC = 0xABBA1972u
215 };
216
217 unsigned int mMagic;
218
219 struct Data
220 {
221 Data() : hal(0) {};
222
223 BaseMetricList baseMetrics;
224 MetricList metrics;
225 RTTIMERLR sampler;
226 pm::CollectorHAL *hal;
227 };
228
229 Data m;
230};
231
232#endif //!____H_PERFORMANCEIMPL
233/* 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