1 // This file contains a Windows implementation of CpuWrapper. 2 // Note: Windows XP, Windows Server 2003 are the minimum requirements. 3 // The requirements are due to the implementation being based on 4 // WMI. 5 /* 6 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 7 * 8 * Use of this source code is governed by a BSD-style license 9 * that can be found in the LICENSE file in the root of the source 10 * tree. An additional intellectual property rights grant can be found 11 * in the file PATENTS. All contributing project authors may 12 * be found in the AUTHORS file in the root of the source tree. 13 */ 14 15 #ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_ 16 #define WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_ 17 18 #include "cpu_wrapper.h" 19 20 #include <Wbemidl.h> 21 22 namespace webrtc { 23 class ConditionVariableWrapper; 24 class CriticalSectionWrapper; 25 class EventWrapper; 26 class ThreadWrapper; 27 28 class CpuWindows : public CpuWrapper 29 { 30 public: 31 virtual WebRtc_Word32 CpuUsage(); 32 virtual WebRtc_Word32 CpuUsage(WebRtc_Word8* /*pProcessName*/, 33 WebRtc_UWord32 /*length*/) {return -1;} 34 virtual WebRtc_Word32 CpuUsage(WebRtc_UWord32 /*dwProcessID*/) {return -1;} 35 36 virtual WebRtc_Word32 CpuUsageMultiCore(WebRtc_UWord32& num_cores, 37 WebRtc_UWord32*& cpu_usage); 38 39 virtual void Reset() {} 40 virtual void Stop() {} 41 42 CpuWindows(); 43 virtual ~CpuWindows(); 44 private: 45 bool AllocateComplexDataTypes(); 46 void DeAllocateComplexDataTypes(); 47 48 void StartPollingCpu(); 49 bool StopPollingCpu(); 50 51 static bool Process(void* thread_object); 52 bool ProcessImpl(); 53 54 bool CreateWmiConnection(); 55 bool CreatePerfOsRefresher(); 56 bool CreatePerfOsCpuHandles(); 57 bool Initialize(); 58 bool Terminate(); 59 60 bool UpdateCpuUsage(); 61 62 ThreadWrapper* cpu_polling_thread; 63 64 bool initialize_; 65 bool has_initialized_; 66 CriticalSectionWrapper* init_crit_; 67 ConditionVariableWrapper* init_cond_; 68 69 bool terminate_; 70 bool has_terminated_; 71 CriticalSectionWrapper* terminate_crit_; 72 ConditionVariableWrapper* terminate_cond_; 73 74 // For sleep with wake-up functionality. 75 EventWrapper* sleep_event; 76 77 // Will be an array. Just care about CPU 0 for now. 78 WebRtc_UWord32* cpu_usage_; 79 80 // One IWbemObjectAccess for each processor and one for the total. 81 // 0-n-1 is the individual processors. 82 // n is the total. 83 IWbemObjectAccess** wbem_enum_access_; 84 DWORD number_of_objects_; 85 86 // Cpu timestamp 87 long cpu_usage_handle_; 88 unsigned __int64* previous_processor_timestamp_; 89 90 // Timestamp 91 long timestamp_sys_100_ns_handle_; 92 unsigned __int64* previous_100ns_timestamp_; 93 94 IWbemServices* wbem_service_; 95 IWbemServices* wbem_service_proxy_; 96 97 IWbemRefresher* wbem_refresher_; 98 99 IWbemHiPerfEnum* wbem_enum_; 100 101 }; 102 } // namespace webrtc 103 #endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_ 104