| /* |
| * Copyright 2010 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_BASE_CPUMONITOR_H_ |
| #define WEBRTC_BASE_CPUMONITOR_H_ |
| |
| #include "webrtc/base/basictypes.h" |
| #include "webrtc/base/messagehandler.h" |
| #include "webrtc/base/scoped_ptr.h" |
| #include "webrtc/base/sigslot.h" |
| #if defined(WEBRTC_LINUX) |
| #include "webrtc/base/stream.h" |
| #endif // defined(WEBRTC_LINUX) |
| |
| namespace rtc { |
| class Thread; |
| class SystemInfo; |
| |
| struct CpuStats { |
| CpuStats() |
| : prev_total_times_(0), |
| prev_cpu_times_(0), |
| prev_load_(0.f), |
| prev_load_time_(0u) { |
| } |
| |
| uint64 prev_total_times_; |
| uint64 prev_cpu_times_; |
| float prev_load_; // Previous load value. |
| uint32 prev_load_time_; // Time previous load value was taken. |
| }; |
| |
| // CpuSampler samples the process and system load. |
| class CpuSampler { |
| public: |
| CpuSampler(); |
| ~CpuSampler(); |
| |
| // Initialize CpuSampler. Returns true if successful. |
| bool Init(); |
| |
| // Set minimum interval in ms between computing new load values. |
| // Default 950 ms. Set to 0 to disable interval. |
| void set_load_interval(int min_load_interval); |
| |
| // Return CPU load of current process as a float from 0 to 1. |
| float GetProcessLoad(); |
| |
| // Return CPU load of current process as a float from 0 to 1. |
| float GetSystemLoad(); |
| |
| // Return number of cpus. Includes hyperthreads. |
| int GetMaxCpus() const; |
| |
| // Return current number of cpus available to this process. |
| int GetCurrentCpus(); |
| |
| // For testing. Allows forcing of fallback to using NTDLL functions. |
| void set_force_fallback(bool fallback) { |
| #if defined(WEBRTC_WIN) |
| force_fallback_ = fallback; |
| #endif |
| } |
| |
| private: |
| float UpdateCpuLoad(uint64 current_total_times, |
| uint64 current_cpu_times, |
| uint64 *prev_total_times, |
| uint64 *prev_cpu_times); |
| CpuStats process_; |
| CpuStats system_; |
| int cpus_; |
| int min_load_interval_; // Minimum time between computing new load. |
| scoped_ptr<SystemInfo> sysinfo_; |
| #if defined(WEBRTC_WIN) |
| void* get_system_times_; |
| void* nt_query_system_information_; |
| bool force_fallback_; |
| #endif |
| #if defined(WEBRTC_LINUX) |
| // File for reading /proc/stat |
| scoped_ptr<FileStream> sfile_; |
| #endif // defined(WEBRTC_LINUX) |
| }; |
| |
| // CpuMonitor samples and signals the CPU load periodically. |
| class CpuMonitor |
| : public rtc::MessageHandler, public sigslot::has_slots<> { |
| public: |
| explicit CpuMonitor(Thread* thread); |
| virtual ~CpuMonitor(); |
| void set_thread(Thread* thread); |
| |
| bool Start(int period_ms); |
| void Stop(); |
| // Signal parameters are current cpus, max cpus, process load and system load. |
| sigslot::signal4<int, int, float, float> SignalUpdate; |
| |
| protected: |
| // Override virtual method of parent MessageHandler. |
| virtual void OnMessage(rtc::Message* msg); |
| // Clear the monitor thread and stop sending it messages if the thread goes |
| // away before our lifetime. |
| void OnMessageQueueDestroyed() { monitor_thread_ = NULL; } |
| |
| private: |
| Thread* monitor_thread_; |
| CpuSampler sampler_; |
| int period_ms_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CpuMonitor); |
| }; |
| |
| } // namespace rtc |
| |
| #endif // WEBRTC_BASE_CPUMONITOR_H_ |