Blame src/smooth_refresh.h

Packit 76ec6a
/* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
Packit 76ec6a
#ifndef _GSM_SMOOTH_REFRESH_H
Packit 76ec6a
#define _GSM_SMOOTH_REFRESH_H
Packit 76ec6a
Packit 76ec6a
#include <giomm.h>
Packit 76ec6a
#include <glibmm.h>
Packit 76ec6a
#include <string>
Packit 76ec6a
Packit 76ec6a
#include "util.h"
Packit 76ec6a
Packit 76ec6a
using std::string;
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
class SmoothRefresh
Packit 76ec6a
  : private procman::NonCopyable
Packit 76ec6a
{
Packit 76ec6a
  public:
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      smooth_refresh_new
Packit 76ec6a
Packit 76ec6a
      @config_interval : pointer to config_interval so we can observe
Packit 76ec6a
      config_interval changes.
Packit 76ec6a
Packit 76ec6a
      @return : initialized SmoothRefresh
Packit 76ec6a
    */
Packit 76ec6a
    SmoothRefresh(Glib::RefPtr<Gio::Settings> a_settings);
Packit 76ec6a
Packit 76ec6a
    ~SmoothRefresh();
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      smooth_refresh_reset
Packit 76ec6a
Packit 76ec6a
      Resets state and re-read config_interval
Packit 76ec6a
    */
Packit 76ec6a
    void reset();
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      smooth_refresh_get
Packit 76ec6a
Packit 76ec6a
      Computes the new refresh_interval so that CPU usage is lower than
Packit 76ec6a
      SMOOTH_REFRESH_PCPU.
Packit 76ec6a
Packit 76ec6a
      @new_interval : where the new refresh_interval is stored.
Packit 76ec6a
Packit 76ec6a
      @return : TRUE is refresh_interval has changed. The new refresh_interval
Packit 76ec6a
      is stored in @new_interval. Else FALSE;
Packit 76ec6a
    */
Packit 76ec6a
    bool get(guint &new_interval);
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
    static const string KEY;
Packit 76ec6a
    static const bool KEY_DEFAULT_VALUE;
Packit 76ec6a
Packit 76ec6a
  private:
Packit 76ec6a
Packit 76ec6a
    unsigned get_own_cpu_usage();
Packit 76ec6a
Packit 76ec6a
    void load_settings_value(Glib::ustring key);
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      fuzzy logic:
Packit 76ec6a
      - decrease refresh interval only if current CPU% and last CPU%
Packit 76ec6a
      are higher than PCPU_LO
Packit 76ec6a
      - increase refresh interval only if current CPU% and last CPU%
Packit 76ec6a
      are higher than PCPU_HI
Packit 76ec6a
Packit 76ec6a
    */
Packit 76ec6a
Packit 76ec6a
    enum
Packit 76ec6a
    {
Packit 76ec6a
        PCPU_HI = 22,
Packit 76ec6a
        PCPU_LO = 18
Packit 76ec6a
    };
Packit 76ec6a
Packit 76ec6a
    /*
Packit 76ec6a
      -self : procman's PID (so we call getpid() only once)
Packit 76ec6a
Packit 76ec6a
      -interval : current refresh interval
Packit 76ec6a
Packit 76ec6a
      -config_interval : pointer to the configuration refresh interval.
Packit 76ec6a
      Used to watch configuration changes
Packit 76ec6a
Packit 76ec6a
      -interval >= -config_interval
Packit 76ec6a
Packit 76ec6a
      -last_pcpu : to avoid spikes, the last CPU%. See PCPU_{LO,HI}
Packit 76ec6a
Packit 76ec6a
      -last_total_time:
Packit 76ec6a
      -last_cpu_time: Save last cpu and process times to compute CPU%
Packit 76ec6a
    */
Packit 76ec6a
Packit 76ec6a
    Glib::RefPtr<Gio::Settings> settings;
Packit 76ec6a
    bool active;
Packit 76ec6a
    sigc::connection connection;
Packit 76ec6a
    guint interval;
Packit 76ec6a
    unsigned  last_pcpu;
Packit 76ec6a
    guint64 last_total_time;
Packit 76ec6a
    guint64 last_cpu_time;
Packit 76ec6a
};
Packit 76ec6a
Packit 76ec6a
Packit 76ec6a
#endif /* _GSM_SMOOTH_REFRESH_H */