/*
 * libjingle
 * Copyright 2010 Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef TALK_BASE_CPUMONITOR_H_
#define TALK_BASE_CPUMONITOR_H_

#include "talk/base/basictypes.h"
#include "talk/base/messagehandler.h"
#include "talk/base/scoped_ptr.h"
#include "talk/base/sigslot.h"
#if defined(LINUX) || defined(ANDROID)
#include "talk/base/stream.h"
#endif // defined(LINUX) || defined(ANDROID)

namespace talk_base {
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) {
#ifdef WIN32
    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_;
#ifdef WIN32
  void* get_system_times_;
  void* nt_query_system_information_;
  bool force_fallback_;
#endif
#if defined(LINUX) || defined(ANDROID)
  // File for reading /proc/stat
  scoped_ptr<FileStream> sfile_;
#endif // defined(LINUX) || defined(ANDROID)
};

// CpuMonitor samples and signals the CPU load periodically.
class CpuMonitor
    : public talk_base::MessageHandler, public sigslot::has_slots<> {
 public:
  explicit CpuMonitor(Thread* thread);
  virtual ~CpuMonitor();

  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(talk_base::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 talk_base

#endif  // TALK_BASE_CPUMONITOR_H_
