103 lines
2.9 KiB
C
103 lines
2.9 KiB
C
|
// 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();
|
||
|
|
||
|
bool 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 initialized_;
|
||
|
CriticalSectionWrapper* init_crit_;
|
||
|
ConditionVariableWrapper* init_cond_;
|
||
|
|
||
|
bool terminate_;
|
||
|
bool 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_;
|
||
|
|
||
|
IWbemRefresher* wbem_refresher_;
|
||
|
|
||
|
IWbemHiPerfEnum* wbem_enum_;
|
||
|
|
||
|
};
|
||
|
} // namespace webrtc
|
||
|
#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_CPU_WINDOWS_NO_CPOL_H_
|