Changeset 9937 in vbox for trunk/src/VBox/Main/MachineImpl.cpp
- Timestamp:
- Jun 25, 2008 6:18:13 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/MachineImpl.cpp
r9904 r9937 147 147 mSession.mPid = NIL_RTPROCESS; 148 148 mSession.mState = SessionState_Closed; 149 150 #ifdef VBOX_WITH_RESOURCE_USAGE_API 151 mUsageSampler = NULL; 152 #endif /* VBOX_WITH_RESOURCE_USAGE_API */ 149 153 } 150 154 … … 498 502 499 503 #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; 504 /* Start resource usage sampler */ 505 { 506 vrc = RTTimerCreate (&mData->mUsageSampler, VBOX_USAGE_SAMPLER_INTERVAL, 507 Machine::UsageSamplerCallback, this); 508 AssertMsgRC (vrc, ("Failed to create resource usage " 509 "sampling timer(%Rra)\n", vrc)); 510 if (RT_FAILURE (vrc)) 511 rc = E_FAIL; 509 512 } 510 513 #endif /* VBOX_WITH_RESOURCE_USAGE_API */ … … 635 638 636 639 #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)); 640 /* Destroy resource usage sampler */ 641 { 642 int vrc = RTTimerDestroy (mData->mUsageSampler); 643 AssertMsgRC (vrc, ("Failed to destroy resource usage " 644 "sampling timer (%Rra)\n", vrc)); 644 645 } 645 646 #endif /* VBOX_WITH_RESOURCE_USAGE_API */ … … 702 703 LogFlowThisFuncLeave(); 703 704 } 704 705 #ifdef VBOX_WITH_RESOURCE_USAGE_API706 void Machine::staticSamplerCallback(PRTTIMER pTimer, void *pvUser, uint64_t iTick)707 {708 ((Machine*)pvUser)->usageSamplerCallback();709 }710 711 void 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 else722 {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 732 705 733 706 // IMachine properties … … 2711 2684 * session. Otherwise read the value from machine extra data, where it is 2712 2685 * stored between sessions. 2713 * 2686 * 2714 2687 * @note since the way this method is implemented depends on whether or not 2715 2688 * a session is currently open, we grab a write lock on the object, in 2716 2689 * order to ensure that the session state does not change during the 2717 2690 * call, and to force us to block if it is currently changing (either 2718 * way) between open and closed. 2691 * way) between open and closed. 2719 2692 */ 2720 2693 STDMETHODIMP Machine::GetConfigRegistryValue (INPTR BSTR aKey, BSTR *aValue) … … 2782 2755 * session. Otherwise read the value from machine extra data, where it is 2783 2756 * stored between sessions. 2784 * 2757 * 2785 2758 * @note since the way this method is implemented depends on whether or not 2786 2759 * a session is currently open, we grab a write lock on the object, in 2787 2760 * order to ensure that the session state does not change during the 2788 2761 * call, and to force us to block if it is currently changing (either 2789 * way) between open and closed. 2762 * way) between open and closed. 2790 2763 */ 2791 2764 STDMETHODIMP Machine::SetConfigRegistryValue (INPTR BSTR aKey, INPTR BSTR aValue) … … 2844 2817 } 2845 2818 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 */ 2856 STDMETHODIMP Machine::GetProcessorUsage(ULONG *user, ULONG *system) 2819 STDMETHODIMP Machine::GetProcessorUsage (ULONG *aUser, ULONG *aSystem) 2857 2820 { 2858 2821 #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); 2822 if (aUser == NULL || aSystem == NULL) 2823 return E_POINTER; 2824 2825 // LogFlowThisFunc (("user=%u%% system=%u%% &mData->mCpuStats=%p\n", 2826 // mData->mCpuStats.u32User / 10000000, 2827 // mData->mCpuStats.u32System / 10000000, &mData->mCpuStats)); 2828 2829 *aUser = mData->mCpuStats.u32User; 2830 *aSystem = mData->mCpuStats.u32System; 2863 2831 return S_OK; 2864 2832 #else /* !VBOX_WITH_RESOURCE_USAGE_API */ … … 7354 7322 } 7355 7323 7324 #ifdef VBOX_WITH_RESOURCE_USAGE_API 7325 7326 /* static */ 7327 void Machine::UsageSamplerCallback (PRTTIMER pTimer, void *pvUser, uint64_t iTick) 7328 { 7329 AssertReturnVoid (pvUser != NULL); 7330 static_cast <Machine *> (pvUser)->usageSamplerCallback(); 7331 } 7332 7333 void Machine::usageSamplerCallback() 7334 { 7335 // LogFlowThisFunc (("mData->mSession.mPid = %u &mData->mCpuStats = %p)\n", 7336 // mData->mSession.mPid, &m_CpuStats)); 7337 if (mData->mSession.mPid != NIL_RTPROCESS) 7338 { 7339 int vrc = RTProcessGetProcessorUsageStats (mData->mSession.mPid, 7340 &mData->mCpuStats); 7341 AssertMsgRC (vrc, ("Failed to get CPU stats (%Rra)\n", vrc)); 7342 } 7343 else 7344 { 7345 mData->mCpuStats.u32User = 0; 7346 mData->mCpuStats.u32System = 0; 7347 } 7348 // LogFlowThisFunc (("user=%u%% system=%u%% &mData->mCpuStats=%p\n", 7349 // mData->mCpuStats.u32User / 10000000, 7350 // mData->mCpuStats.u32System / 10000000, &mData->mCpuStats)); 7351 // LogFlowThisFunc (("user=%.2f system=%.2f\n", 7352 // mData->mCpuStats.u32User/10000000., mData->mCpuStats.u32System/10000000.)); 7353 } 7354 7355 #endif /* VBOX_WITH_RESOURCE_USAGE_API */ 7356 7356 7357 ///////////////////////////////////////////////////////////////////////////// 7357 7358 // SessionMachine class … … 8606 8607 } 8607 8608 8608 /**8609 * Obtains the results of the latest measurement of CPU usage by8610 * 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 */8618 STDMETHODIMP SessionMachine::GetProcessorUsage(ULONG *user, ULONG *system)8619 {8620 return mPeer->GetProcessorUsage(user, system);8621 }8622 8623 8609 // public methods only for internal purposes 8624 8610 /////////////////////////////////////////////////////////////////////////////
Note:
See TracChangeset
for help on using the changeset viewer.