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