3
* Copyright (C) 2004 Carlos Garcia Campos <carlosgc@gnome.org>
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public
7
* License as published by the Free Software Foundation; either
8
* version 2 of the License, or (at your option) any later version.
10
* This library is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
* General Public License for more details.
15
* You should have received a copy of the GNU General Public
16
* License along with this library; if not, write to the Free
17
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19
* Authors : Carlos Garcļæ½a Campos <carlosgc@gnome.org>
22
#include "cpufreq-monitor.h"
24
#define CPUFREQ_MONITOR_GET_PRIVATE(obj) \
25
(G_TYPE_INSTANCE_GET_PRIVATE((obj), CPUFREQ_TYPE_MONITOR, CPUFreqMonitorPrivate))
27
#define CPUFREQ_MONITOR_INTERVAL 1
45
struct _CPUFreqMonitorPrivate {
51
GList *available_freqs;
52
GList *available_govs;
53
guint timeout_handler;
58
static void cpufreq_monitor_init (CPUFreqMonitor *monitor);
59
static void cpufreq_monitor_class_init (CPUFreqMonitorClass *klass);
60
static void cpufreq_monitor_finalize (GObject *object);
62
static void cpufreq_monitor_set_property (GObject *object,
66
static void cpufreq_monitor_get_property (GObject *object,
71
static guint signals[N_SIGNALS];
73
G_DEFINE_ABSTRACT_TYPE (CPUFreqMonitor, cpufreq_monitor, G_TYPE_OBJECT)
76
cpufreq_monitor_init (CPUFreqMonitor *monitor)
78
monitor->priv = CPUFREQ_MONITOR_GET_PRIVATE (monitor);
80
monitor->priv->governor = NULL;
81
monitor->priv->available_freqs = NULL;
82
monitor->priv->available_govs = NULL;
83
monitor->priv->timeout_handler = 0;
85
monitor->priv->changed = FALSE;
89
cpufreq_monitor_class_init (CPUFreqMonitorClass *klass)
91
GObjectClass *object_class = G_OBJECT_CLASS (klass);
93
object_class->set_property = cpufreq_monitor_set_property;
94
object_class->get_property = cpufreq_monitor_get_property;
96
/* Public virtual methods */
98
klass->get_available_frequencies = NULL;
99
klass->get_available_governors = NULL;
101
g_type_class_add_private (klass, sizeof (CPUFreqMonitorPrivate));
104
g_object_class_install_property (object_class,
106
g_param_spec_uint ("cpu",
108
"The cpu to monitor",
114
g_object_class_install_property (object_class,
116
g_param_spec_boolean ("online",
118
"Whether cpu is online",
121
g_object_class_install_property (object_class,
123
g_param_spec_int ("frequency",
125
"The current cpu frequency",
130
g_object_class_install_property (object_class,
132
g_param_spec_int ("max-frequency",
134
"The max cpu frequency",
139
g_object_class_install_property (object_class,
141
g_param_spec_string ("governor",
143
"The current cpufreq governor",
148
signals[SIGNAL_CHANGED] =
149
g_signal_new ("changed",
150
G_TYPE_FROM_CLASS (klass),
152
G_STRUCT_OFFSET (CPUFreqMonitorClass, changed),
154
g_cclosure_marshal_VOID__VOID,
157
object_class->finalize = cpufreq_monitor_finalize;
161
cpufreq_monitor_finalize (GObject *object)
163
CPUFreqMonitor *monitor = CPUFREQ_MONITOR (object);
165
monitor->priv->online = FALSE;
167
if (monitor->priv->timeout_handler > 0) {
168
g_source_remove (monitor->priv->timeout_handler);
169
monitor->priv->timeout_handler = 0;
172
if (monitor->priv->governor) {
173
g_free (monitor->priv->governor);
174
monitor->priv->governor = NULL;
177
if (monitor->priv->available_freqs) {
178
g_list_foreach (monitor->priv->available_freqs,
181
g_list_free (monitor->priv->available_freqs);
182
monitor->priv->available_freqs = NULL;
185
if (monitor->priv->available_govs) {
186
g_list_foreach (monitor->priv->available_govs,
189
g_list_free (monitor->priv->available_govs);
190
monitor->priv->available_govs = NULL;
193
G_OBJECT_CLASS (cpufreq_monitor_parent_class)->finalize (object);
197
cpufreq_monitor_set_property (GObject *object,
202
CPUFreqMonitor *monitor;
204
monitor = CPUFREQ_MONITOR (object);
208
guint cpu = g_value_get_uint (value);
210
if (cpu != monitor->priv->cpu) {
211
monitor->priv->cpu = cpu;
212
monitor->priv->changed = TRUE;
217
monitor->priv->online = g_value_get_boolean (value);
220
case PROP_FREQUENCY: {
221
gint freq = g_value_get_int (value);
223
if (freq != monitor->priv->cur_freq) {
224
monitor->priv->cur_freq = freq;
225
monitor->priv->changed = TRUE;
229
case PROP_MAX_FREQUENCY: {
230
gint freq = g_value_get_int (value);
232
if (freq != monitor->priv->max_freq) {
233
monitor->priv->max_freq = freq;
234
monitor->priv->changed = TRUE;
238
case PROP_GOVERNOR: {
239
const gchar *gov = g_value_get_string (value);
241
if (monitor->priv->governor) {
242
if (g_ascii_strcasecmp (gov, monitor->priv->governor) != 0) {
243
g_free (monitor->priv->governor);
244
monitor->priv->governor = gov ? g_strdup (gov) : NULL;
245
monitor->priv->changed = TRUE;
248
monitor->priv->governor = gov ? g_strdup (gov) : NULL;
249
monitor->priv->changed = TRUE;
254
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, spec);
260
cpufreq_monitor_get_property (GObject *object,
265
CPUFreqMonitor *monitor;
267
monitor = CPUFREQ_MONITOR (object);
271
g_value_set_uint (value, monitor->priv->cpu);
274
g_value_set_boolean (value, monitor->priv->online);
277
g_value_set_int (value, monitor->priv->cur_freq);
279
case PROP_MAX_FREQUENCY:
280
g_value_set_int (value, monitor->priv->max_freq);
283
g_value_set_string (value, monitor->priv->governor);
286
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, spec);
292
cpufreq_monitor_run_cb (CPUFreqMonitor *monitor)
294
CPUFreqMonitorClass *class;
295
gboolean retval = FALSE;
297
class = CPUFREQ_MONITOR_GET_CLASS (monitor);
300
retval = class->run (monitor);
302
if (monitor->priv->changed) {
303
g_signal_emit (monitor, signals[SIGNAL_CHANGED], 0);
304
monitor->priv->changed = FALSE;
311
cpufreq_monitor_run (CPUFreqMonitor *monitor)
313
g_return_if_fail (CPUFREQ_IS_MONITOR (monitor));
315
if (monitor->priv->timeout_handler > 0)
318
monitor->priv->timeout_handler =
319
g_timeout_add_seconds (CPUFREQ_MONITOR_INTERVAL,
320
(GSourceFunc) cpufreq_monitor_run_cb,
325
cpufreq_monitor_get_available_frequencies (CPUFreqMonitor *monitor)
327
CPUFreqMonitorClass *class;
329
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), NULL);
331
if (!monitor->priv->online)
334
if (monitor->priv->available_freqs)
335
return monitor->priv->available_freqs;
337
class = CPUFREQ_MONITOR_GET_CLASS (monitor);
339
if (class->get_available_frequencies) {
340
monitor->priv->available_freqs = class->get_available_frequencies (monitor);
343
return monitor->priv->available_freqs;
347
cpufreq_monitor_get_available_governors (CPUFreqMonitor *monitor)
349
CPUFreqMonitorClass *class;
351
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), NULL);
353
if (!monitor->priv->online)
356
if (monitor->priv->available_govs)
357
return monitor->priv->available_govs;
359
class = CPUFREQ_MONITOR_GET_CLASS (monitor);
361
if (class->get_available_governors) {
362
monitor->priv->available_govs = class->get_available_governors (monitor);
365
return monitor->priv->available_govs;
369
cpufreq_monitor_get_cpu (CPUFreqMonitor *monitor)
371
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), 0);
373
return monitor->priv->cpu;
377
cpufreq_monitor_set_cpu (CPUFreqMonitor *monitor, guint cpu)
379
g_return_if_fail (CPUFREQ_IS_MONITOR (monitor));
381
g_object_set (G_OBJECT (monitor),
386
cpufreq_monitor_get_frequency (CPUFreqMonitor *monitor)
388
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), -1);
390
return monitor->priv->cur_freq;
394
cpufreq_monitor_get_governor (CPUFreqMonitor *monitor)
396
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), NULL);
398
return monitor->priv->governor;
402
cpufreq_monitor_get_percentage (CPUFreqMonitor *monitor)
404
g_return_val_if_fail (CPUFREQ_IS_MONITOR (monitor), -1);
406
if (monitor->priv->max_freq > 0) {
407
return ((monitor->priv->cur_freq * 100) / monitor->priv->max_freq);