// This file contains a Windows implementation of CpuWrapper. // Note: Windows XP, Windows Server 2003 are the minimum requirements. // The requirements are due to the implementation being based on // WMI. /* * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_ #define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_ #include "cpu_wrapper.h" #include <Wbemidl.h> namespace webrtc { class ConditionVariableWrapper; class CriticalSectionWrapper; class EventWrapper; class ThreadWrapper; class CpuWindows : public CpuWrapper { public: virtual WebRtc_Word32 CpuUsage(); virtual WebRtc_Word32 CpuUsage(WebRtc_Word8* /*pProcessName*/, WebRtc_UWord32 /*length*/) {return -1;} virtual WebRtc_Word32 CpuUsage(WebRtc_UWord32 /*dwProcessID*/) {return -1;} virtual WebRtc_Word32 CpuUsageMultiCore(WebRtc_UWord32& num_cores, WebRtc_UWord32*& cpu_usage); virtual void Reset() {} virtual void Stop() {} CpuWindows(); virtual ~CpuWindows(); private: bool AllocateComplexDataTypes(); void DeAllocateComplexDataTypes(); void StartPollingCpu(); bool StopPollingCpu(); static bool Process(void* thread_object); bool ProcessImpl(); bool CreateWmiConnection(); bool CreatePerfOsRefresher(); bool CreatePerfOsCpuHandles(); bool Initialize(); bool Terminate(); bool UpdateCpuUsage(); ThreadWrapper* cpu_polling_thread; bool initialize_; bool has_initialized_; CriticalSectionWrapper* init_crit_; ConditionVariableWrapper* init_cond_; bool terminate_; bool has_terminated_; CriticalSectionWrapper* terminate_crit_; ConditionVariableWrapper* terminate_cond_; // For sleep with wake-up functionality. EventWrapper* sleep_event; // Will be an array. Just care about CPU 0 for now. WebRtc_UWord32* cpu_usage_; // One IWbemObjectAccess for each processor and one for the total. // 0-n-1 is the individual processors. // n is the total. IWbemObjectAccess** wbem_enum_access_; DWORD number_of_objects_; // Cpu timestamp long cpu_usage_handle_; unsigned __int64* previous_processor_timestamp_; // Timestamp long timestamp_sys_100_ns_handle_; unsigned __int64* previous_100ns_timestamp_; IWbemServices* wbem_service_; IWbemServices* wbem_service_proxy_; IWbemRefresher* wbem_refresher_; IWbemHiPerfEnum* wbem_enum_; }; } // namespace webrtc #endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_