VirtualBox

Ignore:
Timestamp:
Jun 25, 2008 11:03:03 AM (17 years ago)
Author:
vboxsync
Message:

Global and per-VM CPU usage API added

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/MachineImpl.cpp

    r9900 r9904  
    378378    AssertReturn (aConfigFile, E_INVALIDARG);
    379379    AssertReturn (aMode != Init_New || (aName != NULL && *aName != '\0'),
    380                               E_INVALIDARG);
     380                  E_INVALIDARG);
    381381    AssertReturn (aMode != Init_Registered || aId != NULL, E_FAIL);
    382382
     
    497497    }
    498498
     499#ifdef VBOX_WITH_RESOURCE_USAGE_API
     500    /*
     501     * Start resource usage sampler.
     502     */
     503    printf("Creating sampling timer with Machine::staticSamplerCallback, this=%p\n", this);
     504    int result = RTTimerCreate(&m_pUsageSampler, VBOX_USAGE_SAMPLER_INTERVAL, Machine::staticSamplerCallback, this);
     505    if (RT_FAILURE(result))
     506    {
     507        AssertMsgFailed(("Failed to create resource usage sampling timer, rc=%d!\n", result));
     508        rc = E_FAIL;
     509    }
     510#endif /* VBOX_WITH_RESOURCE_USAGE_API */
     511
    499512    LogFlowThisFunc (("mName='%ls', mRegistered=%RTbool, mAccessible=%RTbool "
    500513                      "rc=%08X\n",
     
    620633     */
    621634    AutoMultiWriteLock2 alock (mParent, this);
     635
     636#ifdef VBOX_WITH_RESOURCE_USAGE_API
     637    /*
     638     * Destroy resource usage sampler.
     639     */
     640    int rc = RTTimerDestroy(m_pUsageSampler);
     641    if (RT_FAILURE(rc))
     642    {
     643        AssertMsgFailed(("Failed to destroy resource usage sampling timer, rc=%d!\n", rc));
     644    }
     645#endif /* VBOX_WITH_RESOURCE_USAGE_API */
    622646
    623647    if (!mData->mSession.mMachine.isNull())
     
    678702    LogFlowThisFuncLeave();
    679703}
     704
     705#ifdef VBOX_WITH_RESOURCE_USAGE_API
     706void Machine::staticSamplerCallback(PRTTIMER pTimer, void *pvUser, uint64_t iTick)
     707{
     708    ((Machine*)pvUser)->usageSamplerCallback();
     709}
     710
     711void Machine::usageSamplerCallback()
     712{
     713    //LogFlowThisFunc(("mData->mSession.mPid = %u &m_CpuStats = %p)\n", mData->mSession.mPid, &m_CpuStats));
     714    if (mData->mSession.mPid != NIL_RTPROCESS) {
     715        int rc = RTProcessGetProcessorUsageStats(mData->mSession.mPid, &m_CpuStats);
     716        if (RT_FAILURE(rc))
     717        {
     718            AssertMsgFailed(("Failed to get CPU stats, rc=%d!\n", rc));
     719        }
     720    }
     721    else
     722    {
     723        m_CpuStats.u32User   = 0;
     724        m_CpuStats.u32System = 0;
     725    }
     726//  printf("Machine::usageSamplerCallback: user=%u%% system=%u%% &m_CpuStats=%p this=%p\n",
     727//         m_CpuStats.u32User / 10000000, m_CpuStats.u32System / 10000000, &m_CpuStats, this);
     728    //printf("user=%.2f system=%.2f\n", m_CpuStats.u32User/10000000., m_CpuStats.u32System/10000000.);
     729}
     730#endif /* VBOX_WITH_RESOURCE_USAGE_API */
     731
    680732
    681733// IMachine properties
     
    27922844}
    27932845
     2846/**
     2847 * Obtains the results of the latest measurement of CPU usage by
     2848 * this machine.
     2849 *
     2850 * @returns error code.
     2851 *
     2852 * @param   user      out   % of CPU time spent in user mode.
     2853 * @param   system    out   % of CPU time spent in kernel mode.
     2854 *
     2855 */
     2856STDMETHODIMP Machine::GetProcessorUsage(ULONG *user, ULONG *system)
     2857{
     2858#ifdef VBOX_WITH_RESOURCE_USAGE_API
     2859    *user   = m_CpuStats.u32User;
     2860    *system = m_CpuStats.u32System;
     2861//  printf("Machine::GetProcessorUsage: user=%u%% system=%u%% &m_CpuStats=%p this=%p\n",
     2862//         m_CpuStats.u32User / 10000000, m_CpuStats.u32System / 10000000, &m_CpuStats, this);
     2863    return S_OK;
     2864#else /* !VBOX_WITH_RESOURCE_USAGE_API */
     2865    return E_NOTIMPL;
     2866#endif /* !VBOX_WITH_RESOURCE_USAGE_API */
     2867}
     2868
    27942869
    27952870// public methods for internal purposes
     
    85318606}
    85328607
     8608/**
     8609 * Obtains the results of the latest measurement of CPU usage by
     8610 * this machine.
     8611 *
     8612 * @returns error code.
     8613 *
     8614 * @param   user      out   % of CPU time spent in user mode.
     8615 * @param   system    out   % of CPU time spent in kernel mode.
     8616 *
     8617 */
     8618STDMETHODIMP SessionMachine::GetProcessorUsage(ULONG *user, ULONG *system)
     8619{
     8620    return mPeer->GetProcessorUsage(user, system);
     8621}
     8622
    85338623// public methods only for internal purposes
    85348624/////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.

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