Performance.h revision 30f7bd6bf198ae0489df375e5a17cb086acb30fb
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * VBox Performance Classes declaration.
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * additional information or have any questions.
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync const uint64_t PM_CPU_LOAD_MULTIPLIER = UINT64_C(100000000);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Sub Metrics **********************************************************/
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync CircularBuffer() : mData(0), mLength(0), mEnd(0), mWrapped(false) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long length();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long *mData;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mLength;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mEnd;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *mName;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Collector Hardware Abstraction Layer *********************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostCpuLoad(unsigned long *user, unsigned long *kernel, unsigned long *idle);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostMemoryUsage(unsigned long *total, unsigned long *used, unsigned long *available) = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getProcessCpuLoad(RTPROCESS process, unsigned long *user, unsigned long *kernel);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getProcessMemoryUsage(RTPROCESS process, unsigned long *used) = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getRawHostCpuLoad(unsigned long *user, unsigned long *kernel, unsigned long *idle);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getRawProcessCpuLoad(RTPROCESS process, unsigned long *user, unsigned long *kernel);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostMemoryUsage(unsigned long *total, unsigned long *used, unsigned long *available);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getProcessMemoryUsage(RTPROCESS process, unsigned long *used);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getRawHostCpuLoad(unsigned long *user, unsigned long *kernel, unsigned long *idle);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getRawProcessCpuLoad(RTPROCESS process, unsigned long *user, unsigned long *kernel);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Base Metrics *********************************************************/
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync BaseMetric(CollectorHAL *hal, const char *name, ComPtr<IUnknown> object)
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync : mHAL(hal), mLength(0), mName(name), mObject(object), mLastSampleTaken(0), mEnabled(false) {};
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync virtual void init(unsigned long period, unsigned long length) = 0;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool associatedWith(ComPtr<IUnknown> object) { return mObject == object; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mPeriod;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mLength;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync const char *mName;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync HostCpuLoad(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *user, SubMetric *kernel, SubMetric *idle)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "CPU/Load", object), mUser(user), mKernel(kernel), mIdle(idle) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync HostCpuLoadRaw(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *user, SubMetric *kernel, SubMetric *idle)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync : HostCpuLoad(hal, object, user, kernel, idle), mUserPrev(0), mKernelPrev(0), mIdlePrev(0) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mUserPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mKernelPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mIdlePrev;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync HostCpuMhz(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *mhz)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "CPU/MHz", object), mMHz(mhz) {};
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync HostRamUsage(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *total, SubMetric *used, SubMetric *available)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "RAM/Usage", object), mTotal(total), mUsed(used), mAvailable(available) {};
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync MachineCpuLoad(CollectorHAL *hal, ComPtr<IUnknown> object, RTPROCESS process, SubMetric *user, SubMetric *kernel)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "CPU/Load", object), mProcess(process), mUser(user), mKernel(kernel) {};
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync MachineCpuLoadRaw(CollectorHAL *hal, ComPtr<IUnknown> object, RTPROCESS process, SubMetric *user, SubMetric *kernel)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync : MachineCpuLoad(hal, object, process, user, kernel), mHostTotalPrev(0), mProcessUserPrev(0), mProcessKernelPrev(0) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mHostTotalPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mProcessUserPrev;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync MachineRamUsage(CollectorHAL *hal, ComPtr<IUnknown> object, RTPROCESS process, SubMetric *used)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "RAM/Usage", object), mProcess(process), mUsed(used) {};
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Aggregate Functions **************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length) = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Metric Class *********************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync Metric(BaseMetric *baseMetric, SubMetric *subMetric, Aggregate *aggregate) :
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync mName(subMetric->getName()), mBaseMetric(baseMetric), mSubMetric(subMetric), mAggregate(aggregate)
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool associatedWith(ComPtr<IUnknown> object) { return getObject() == object; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync ComPtr<IUnknown> getObject() { return mBaseMetric->getObject(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return mBaseMetric->getUnit(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return mBaseMetric->getMinValue(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return mBaseMetric->getMaxValue(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getPeriod() { return mBaseMetric->getPeriod(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getLength() { return mBaseMetric->getLength(); };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void query(unsigned long **data, unsigned long *count);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Metric Factories *****************************************************/
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createHostCpuLoad(ComPtr<IUnknown> object, SubMetric *user, SubMetric *kernel, SubMetric *idle);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createHostCpuMHz(ComPtr<IUnknown> object, SubMetric *mhz);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createHostRamUsage(ComPtr<IUnknown> object, SubMetric *total, SubMetric *used, SubMetric *available);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createMachineCpuLoad(ComPtr<IUnknown> object, RTPROCESS process, SubMetric *user, SubMetric *kernel);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createMachineRamUsage(ComPtr<IUnknown> object, RTPROCESS process, SubMetric *used);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // @todo Move implementation to linux/PerformanceLinux.cpp
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createHostCpuLoad(ComPtr<IUnknown> object, SubMetric *user, SubMetric *kernel, SubMetric *idle);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync virtual BaseMetric *createMachineCpuLoad(ComPtr<IUnknown> object, RTPROCESS process, SubMetric *user, SubMetric *kernel);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool match(const ComPtr<IUnknown> object, const std::string &name) const;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync typedef std::pair<const ComPtr<IUnknown>, const std::string> FilterElement;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void processMetricList(const std::string &name, const ComPtr<IUnknown> object);