Performance.h revision 30f7bd6bf198ae0489df375e5a17cb086acb30fb
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/* $Id$ */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/** @file
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync *
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * VBox Performance Classes declaration.
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync/*
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
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 * 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.
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync */
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#include <iprt/types.h>
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#include <VBox/com/defs.h>
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync#include <list>
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync#include <string>
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsyncnamespace pm {
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync const uint64_t PM_CPU_LOAD_MULTIPLIER = UINT64_C(100000000);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Sub Metrics **********************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class CircularBuffer
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync CircularBuffer() : mData(0), mLength(0), mEnd(0), mWrapped(false) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void init(unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long length();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void put(unsigned long value);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void copyTo(unsigned long *data);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long *mData;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mLength;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mEnd;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool mWrapped;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class SubMetric : public CircularBuffer
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric(const char *name)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync : mName(name) {};
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void query(unsigned long *data);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getName() { return mName; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *mName;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Collector Hardware Abstraction Layer *********************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class CollectorHAL
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostCpuLoad(unsigned long *user, unsigned long *kernel, unsigned long *idle);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostCpuMHz(unsigned long *mhz) = 0;
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
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 };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class CollectorLinux : public CollectorHAL
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostCpuMHz(unsigned long *mhz);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getHostMemoryUsage(unsigned long *total, unsigned long *used, unsigned long *available);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual int getProcessMemoryUsage(RTPROCESS process, unsigned long *used);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
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 };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Base Metrics *********************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync BaseMetric(CollectorHAL *hal, const char *name, ComPtr<IUnknown> object)
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync : mHAL(hal), mLength(0), mName(name), mObject(object), mLastSampleTaken(0), mEnabled(false) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync virtual void init(unsigned long period, unsigned long length) = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual void collect() = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual const char *getUnit() = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long getMinValue() = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long getMaxValue() = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void collectorBeat(uint64_t nowAt);
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void enable() { mEnabled = true; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void disable() { mEnabled = false; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool isEnabled() { return mEnabled; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getPeriod() { return mPeriod; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getLength() { return mLength; };
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync const char *getName() { return mName; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync ComPtr<IUnknown> getObject() { return mObject; };
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool associatedWith(ComPtr<IUnknown> object) { return mObject == object; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync protected:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync CollectorHAL *mHAL;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mPeriod;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync unsigned long mLength;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync const char *mName;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync ComPtr<IUnknown> mObject;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync uint64_t mLastSampleTaken;
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool mEnabled;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class HostCpuLoad : public BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
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
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return "%"; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return 100000000; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync protected:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mUser;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mKernel;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mIdle;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class HostCpuLoadRaw : public HostCpuLoad
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
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
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mUserPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mKernelPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mIdlePrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class HostCpuMhz : public BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync HostCpuMhz(CollectorHAL *hal, ComPtr<IUnknown> object, SubMetric *mhz)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "CPU/MHz", object), mMHz(mhz) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return "MHz"; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mMHz;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class HostRamUsage : public BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
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) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return "kB"; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mTotal;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mUsed;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mAvailable;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class MachineCpuLoad : public BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
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) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return "%"; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return 100000000; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync protected:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync RTPROCESS mProcess;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mUser;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mKernel;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class MachineCpuLoadRaw : public MachineCpuLoad
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
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
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mHostTotalPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mProcessUserPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long mProcessKernelPrev;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class MachineRamUsage : public BaseMetric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync MachineRamUsage(CollectorHAL *hal, ComPtr<IUnknown> object, RTPROCESS process, SubMetric *used)
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync : BaseMetric(hal, "RAM/Usage", object), mProcess(process), mUsed(used) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync void init(unsigned long period, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync void collect();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getUnit() { return "kB"; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMinValue() { return 0; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync unsigned long getMaxValue() { return UINT32_MAX; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync RTPROCESS mProcess;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mUsed;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Aggregate Functions **************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class Aggregate
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length) = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual const char *getName() = 0;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class AggregateAvg : public Aggregate
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual const char *getName();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class AggregateMin : public Aggregate
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual const char *getName();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class AggregateMax : public Aggregate
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual unsigned long compute(unsigned long *data, unsigned long length);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync virtual const char *getName();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Metric Class *********************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class Metric
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync Metric(BaseMetric *baseMetric, SubMetric *subMetric, Aggregate *aggregate) :
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync mName(subMetric->getName()), mBaseMetric(baseMetric), mSubMetric(subMetric), mAggregate(aggregate)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync if (mAggregate)
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync mName += ":";
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync mName += mAggregate->getName();
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync }
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync }
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync ~Metric()
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync delete mAggregate;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync }
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool associatedWith(ComPtr<IUnknown> object) { return getObject() == object; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync const char *getName() { return mName.c_str(); };
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
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync private:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync std::string mName;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync BaseMetric *mBaseMetric;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync SubMetric *mSubMetric;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync Aggregate *mAggregate;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync /* Metric Factories *****************************************************/
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class MetricFactory
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync MetricFactory() : mHAL(0) {};
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync ~MetricFactory() { delete mHAL; };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
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 protected:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync CollectorHAL *mHAL;
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync // @todo Move implementation to linux/PerformanceLinux.cpp
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync class MetricFactoryLinux : public MetricFactory
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync {
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync public:
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync MetricFactoryLinux();
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);
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync };
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync class Filter
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync {
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync public:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync Filter(ComSafeArrayIn(INPTR BSTR, metricNames),
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync ComSafeArrayIn(IUnknown * , objects));
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync bool match(const ComPtr<IUnknown> object, const std::string &name) const;
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync private:
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync typedef std::pair<const ComPtr<IUnknown>, const std::string> FilterElement;
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync typedef std::list<FilterElement> ElementList;
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync
30f7bd6bf198ae0489df375e5a17cb086acb30fbvboxsync ElementList mElements;
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync
6c5e2fff0e3fdfc7c3f3fb2e7b7ec8ebb2223cecvboxsync void processMetricList(const std::string &name, const ComPtr<IUnknown> object);
f2fedb6cbb946e9dd6d418b1472373395e2ac34fvboxsync };
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync}
05c28d9d4557bed6e320dfee1acca69408bc3c15vboxsync