// 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_