Performance.cpp revision 2db3ef4e3e71073797237d3c34dcd7d9943a26aa
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VBox Performance Classes implementation.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * available from http://www.virtualbox.org. This file is free software;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * you can redistribute it and/or modify it under the terms of the GNU
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * General Public License (GPL) as published by the Free Software
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * additional information or have any questions.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @todo list:
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 1) Solaris backend
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 2) Linux backend
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 3) Detection of erroneous metric names
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 4) Min/max ranges for metrics
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 5) Darwin backend
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 6) [OS/2 backend]
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncusing namespace pm;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync// Default factory
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncBaseMetric *MetricFactory::createHostCpuLoad(ComPtr<IUnknown> object, SubMetric *user, SubMetric *kernel, SubMetric *idle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return new HostCpuLoadRaw(mHAL, object, user, kernel, idle);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncBaseMetric *MetricFactory::createHostCpuMHz(ComPtr<IUnknown> object, SubMetric *mhz)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncBaseMetric *MetricFactory::createHostRamUsage(ComPtr<IUnknown> object, SubMetric *total, SubMetric *used, SubMetric *available)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return new HostRamUsage(mHAL, object, total, used, available);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncBaseMetric *MetricFactory::createMachineCpuLoad(ComPtr<IUnknown> object, RTPROCESS process, SubMetric *user, SubMetric *kernel)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return new MachineCpuLoadRaw(mHAL, object, process, user, kernel);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncBaseMetric *MetricFactory::createMachineRamUsage(ComPtr<IUnknown> object, RTPROCESS process, SubMetric *used)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return new MachineRamUsage(mHAL, object, process, used);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync// Stubs for non-pure virtual methods
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncint CollectorHAL::getHostCpuLoad(ULONG *user, ULONG *kernel, ULONG *idle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncint CollectorHAL::getProcessCpuLoad(RTPROCESS process, ULONG *user, ULONG *kernel)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncint CollectorHAL::getRawHostCpuLoad(uint64_t *user, uint64_t *kernel, uint64_t *idle)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncint CollectorHAL::getRawProcessCpuLoad(RTPROCESS process, uint64_t *user, uint64_t *kernel, uint64_t *total)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Log4(("{%p} " LOG_FN_FMT ": Collecting data for obj(%p)...\n", this, __PRETTY_FUNCTION__, (void *)mObject));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync/*bool BaseMetric::associatedWith(ComPtr<IUnknown> object)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync LogFlowThisFunc (("mObject(%p) == object(%p) is %s.\n", mObject, object, mObject == object ? "true" : "false"));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync return mObject == object;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = mHAL->getHostCpuLoad(&user, &kernel, &idle);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint64_t userDiff, kernelDiff, idleDiff, totalDiff;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = mHAL->getRawHostCpuLoad(&user, &kernel, &idle);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* This is only possible if none of counters has changed! */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync LogFlowThisFunc (("Impossible! User, kernel and idle raw "
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync "counters has not changed since last sample.\n" ));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync mUser->put((ULONG)(PM_CPU_LOAD_MULTIPLIER * userDiff / totalDiff));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync mKernel->put((ULONG)(PM_CPU_LOAD_MULTIPLIER * kernelDiff / totalDiff));
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync mIdle->put((ULONG)(PM_CPU_LOAD_MULTIPLIER * idleDiff / totalDiff));
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int rc = mHAL->getHostMemoryUsage(&total, &used, &available);
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncvoid MachineCpuLoad::init(ULONG period, ULONG length)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int rc = mHAL->getProcessCpuLoad(mProcess, &user, &kernel);
mUser->put((ULONG)(PM_CPU_LOAD_MULTIPLIER * (processUser - mProcessUserPrev) / (hostTotal - mHostTotalPrev)));
mKernel->put((ULONG)(PM_CPU_LOAD_MULTIPLIER * (processKernel - mProcessKernelPrev ) / (hostTotal - mHostTotalPrev)));
if (mData)
mWrapped = false;
mEnd = 0;
if (mData)
mEnd = 0;
mWrapped = true;
if (mWrapped)
if (mEnd)
if (length)
if (mAggregate)
*count = 0;
*data = 0;
return tmp;
return tmp;