summaryrefslogtreecommitdiffstats
path: root/x11/gnome-applets/files
diff options
context:
space:
mode:
authormarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2005-02-14 13:54:59 +0800
committermarcus <marcus@df743ca5-7f9a-e211-a948-0013205c9059>2005-02-14 13:54:59 +0800
commitd662472550375f87b65fad1eff94856cb520c9e2 (patch)
tree6a6fc2fc5899bb754cd2dc30e3e4a5ddd15c078c /x11/gnome-applets/files
parent15366306a0eb6be860cd219fb15656c006e28d52 (diff)
downloadmarcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar.gz
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar.bz2
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar.lz
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar.xz
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.tar.zst
marcuscom-ports-d662472550375f87b65fad1eff94856cb520c9e2.zip
Complete cpufreq support by adding the ability to set the frequency from
the applet. Initial tests shows this works, but I would appreciate real-world feedback. git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@3650 df743ca5-7f9a-e211-a948-0013205c9059
Diffstat (limited to 'x11/gnome-applets/files')
-rw-r--r--x11/gnome-applets/files/patch-cpufreq-freebsd237
-rw-r--r--x11/gnome-applets/files/patch-cpufreq-selector-freebsd373
2 files changed, 496 insertions, 114 deletions
diff --git a/x11/gnome-applets/files/patch-cpufreq-freebsd b/x11/gnome-applets/files/patch-cpufreq-freebsd
index ac8ba31bb..48f2ebb6c 100644
--- a/x11/gnome-applets/files/patch-cpufreq-freebsd
+++ b/x11/gnome-applets/files/patch-cpufreq-freebsd
@@ -83,9 +83,114 @@
+CPUFreqMonitor *cpufreq_monitor_sysctl_new (guint cpu);
+
+#endif /* __CPUFREQ_MONITOR_SYSCTL_H__ */
---- cpufreq/src/cpufreq-monitor-sysctl.c.orig Sun Feb 13 01:46:05 2005
-+++ cpufreq/src/cpufreq-monitor-sysctl.c Sun Feb 13 02:54:18 2005
-@@ -0,0 +1,265 @@
+--- cpufreq/src/cpufreq-monitor-cpuinfo.c.orig Fri Dec 31 14:39:04 2004
++++ cpufreq/src/cpufreq-monitor-cpuinfo.c Sun Feb 13 23:58:38 2005
+@@ -22,6 +22,10 @@
+ #include <glib/gi18n.h>
+ #include <libgnomevfs/gnome-vfs.h>
+
++#ifdef __FreeBSD__
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#endif /* __FreeBSD__ */
+ #include <string.h>
+
+ #include "cpufreq-monitor-cpuinfo.h"
+@@ -102,6 +106,7 @@
+ static gboolean
+ cpufreq_monitor_cpuinfo_get (gpointer gdata)
+ {
++#ifndef __FreeBSD__
+ GnomeVFSHandle *handle;
+ GnomeVFSFileSize bytes_read;
+ GnomeVFSResult result;
+@@ -109,6 +114,9 @@
+ gchar **lines;
+ gchar buffer[256];
+ gchar *p;
++#else
++ size_t len;
++#endif /* __FreeBSD__ */
+ gchar *freq, *perc, *unit, *governor;
+ gint cpu, i;
+ CPUFreqMonitorCPUInfo *monitor;
+@@ -118,6 +126,7 @@
+
+ private = CPUFREQ_MONITOR_GET_PROTECTED (CPUFREQ_MONITOR (monitor));
+
++#ifndef __FreeBSD__
+ uri = gnome_vfs_get_uri_from_local_path ("/proc/cpuinfo");
+
+ result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
+@@ -178,6 +187,12 @@
+
+ g_strfreev (lines);
+ g_free (file);
++#else
++ len = sizeof (cpu);
++
++ if (sysctlbyname ("hw.clockrate", &cpu, &len, NULL, 0) == -1)
++ return FALSE;
++#endif /* __FreeBSD__ */
+
+ governor = g_strdup (_("Frequency Scaling Unsupported"));
+ freq = parent_class->get_human_readable_freq (cpu * 1000); /* kHz are expected*/
+--- cpufreq/src/cpufreq-monitor-factory.c.orig Mon Dec 27 12:53:46 2004
++++ cpufreq/src/cpufreq-monitor-factory.c Sun Feb 13 23:58:44 2005
+@@ -16,13 +16,21 @@
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Authors : Carlos García Campos <carlosgc@gnome.org>
++ * Joe Marcus Clarke <marcus@FreeBSD.org>
+ */
+
+ #include <glib.h>
++#ifdef __FreeBSD__
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#endif /* __FreeBSD__ */
+
+ #include "cpufreq-applet.h"
+ #include "cpufreq-monitor-sysfs.h"
+ #include "cpufreq-monitor-procfs.h"
++#ifdef __FreeBSD__
++#include "cpufreq-monitor-sysctl.h"
++#endif /* __FreeBSD__ */
+ #include "cpufreq-monitor-cpuinfo.h"
+ #include "cpufreq-monitor-factory.h"
+
+@@ -30,6 +38,7 @@
+ cpufreq_monitor_factory_create_monitor (guint cpu)
+ {
+ CPUFreqMonitor *monitor = NULL;
++#ifndef __FreeBSD__
+
+ if (g_file_test ("/sys/devices/system/cpu/cpu0/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.6 kernel */
+ monitor = cpufreq_monitor_sysfs_new (cpu);
+@@ -48,6 +57,20 @@
+
+ monitor = cpufreq_monitor_cpuinfo_new (cpu);
+ }
++#else
++ size_t len;
++
++ if (sysctlbyname ("dev.cpu.0.freq", NULL, &len, NULL, 0) == 0) {
++ monitor = cpufreq_monitor_sysctl_new (cpu);
++ } else {
++ cpufreq_applet_display_error (_("CPU frequency scaling unsupported"),
++ _("You will not be able to modify the frequency of your machine. "
++ "Your machine may be misconfigured or not have hardware support "
++ "for CPU frequency scaling."));
++
++ monitor = cpufreq_monitor_cpuinfo_new (cpu);
++ }
++#endif /* __FreeBSD__ */
+
+ return monitor;
+ }
+--- cpufreq/src/cpufreq-monitor-sysctl.c.orig Sun Feb 13 03:52:42 2005
++++ cpufreq/src/cpufreq-monitor-sysctl.c Mon Feb 14 00:42:07 2005
+@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2001, 2002 Free Software Foundation
+ *
@@ -199,7 +304,6 @@
+ gchar *freq, *perc, *unit, *governor;
+ gboolean changed;
+ size_t len;
-+ gint mib[4];
+ gchar *freq_oid;
+ CPUFreqMonitorSysctl *monitor;
+ CPUFreqMonitorProtected *private;
@@ -338,7 +442,12 @@
+ gchar **frpr;
+
+ frpr = g_strsplit (*l, "/", 0);
-+ if (frpr[0] != NULL) {
++ if (frpr && frpr[0] != NULL) {
++ /* sysctl format is %d/%d where the
++ * first %d is the frequency, and
++ * the second is the power used in
++ * mW.
++ */
+ int freq = atoi (frpr[0]);
+ private->available_freqs =
+ g_list_append (private->available_freqs, g_strdup_printf ("%d", freq * 1000));
@@ -351,116 +460,17 @@
+ return private->available_freqs;
+}
+#endif /* __FreeBSD__ */
---- cpufreq/src/cpufreq-monitor-factory.c.orig Mon Dec 27 12:53:46 2004
-+++ cpufreq/src/cpufreq-monitor-factory.c Sun Feb 13 02:56:39 2005
-@@ -16,13 +16,21 @@
+--- cpufreq/src/cpufreq-applet.c.orig Fri Jan 14 23:38:20 2005
++++ cpufreq/src/cpufreq-applet.c Mon Feb 14 00:47:36 2005
+@@ -16,6 +16,7 @@
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Authors : Carlos García Campos <carlosgc@gnome.org>
+ * Joe Marcus Clarke <marcus@FreeBSD.org>
*/
- #include <glib.h>
-+#ifdef __FreeBSD__
-+#include <sys/types.h>
-+#include <sys/sysctl.h>
-+#endif /* __FreeBSD__ */
-
- #include "cpufreq-applet.h"
- #include "cpufreq-monitor-sysfs.h"
- #include "cpufreq-monitor-procfs.h"
-+#ifdef __FreeBSD__
-+#include "cpufreq-monitor-sysctl.h"
-+#endif /* __FreeBSD__ */
- #include "cpufreq-monitor-cpuinfo.h"
- #include "cpufreq-monitor-factory.h"
-
-@@ -30,6 +38,7 @@
- cpufreq_monitor_factory_create_monitor (guint cpu)
- {
- CPUFreqMonitor *monitor = NULL;
-+#ifndef __FreeBSD__
-
- if (g_file_test ("/sys/devices/system/cpu/cpu0/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.6 kernel */
- monitor = cpufreq_monitor_sysfs_new (cpu);
-@@ -48,6 +57,21 @@
-
- monitor = cpufreq_monitor_cpuinfo_new (cpu);
- }
-+#else
-+ gint mib[4];
-+ size_t len;
-+
-+ if (sysctlbyname ("dev.cpu.0.freq", NULL, &len, NULL, 0) == 0) {
-+ monitor = cpufreq_monitor_sysctl_new (cpu);
-+ } else {
-+ cpufreq_applet_display_error (_("CPU frequency scaling unsupported"),
-+ _("You will not be able to modify the frequency of your machine. "
-+ "Your machine may be misconfigured or not have hardware support "
-+ "for CPU frequency scaling."));
-+
-+ monitor = cpufreq_monitor_cpuinfo_new (cpu);
-+ }
-+#endif /* __FreeBSD__ */
-
- return monitor;
- }
---- cpufreq/src/cpufreq-monitor-cpuinfo.c.orig Fri Dec 31 14:39:04 2004
-+++ cpufreq/src/cpufreq-monitor-cpuinfo.c Sun Feb 13 02:54:51 2005
-@@ -22,6 +22,10 @@
- #include <glib/gi18n.h>
- #include <libgnomevfs/gnome-vfs.h>
-
-+#ifdef __FreeBSD__
-+#include <sys/types.h>
-+#include <sys/sysctl.h>
-+#endif /* __FreeBSD__ */
- #include <string.h>
-
- #include "cpufreq-monitor-cpuinfo.h"
-@@ -102,6 +106,7 @@
- static gboolean
- cpufreq_monitor_cpuinfo_get (gpointer gdata)
- {
-+#ifndef __FreeBSD__
- GnomeVFSHandle *handle;
- GnomeVFSFileSize bytes_read;
- GnomeVFSResult result;
-@@ -109,6 +114,10 @@
- gchar **lines;
- gchar buffer[256];
- gchar *p;
-+#else
-+ gint mib[2];
-+ size_t len;
-+#endif /* __FreeBSD__ */
- gchar *freq, *perc, *unit, *governor;
- gint cpu, i;
- CPUFreqMonitorCPUInfo *monitor;
-@@ -118,6 +127,7 @@
-
- private = CPUFREQ_MONITOR_GET_PROTECTED (CPUFREQ_MONITOR (monitor));
-
-+#ifndef __FreeBSD__
- uri = gnome_vfs_get_uri_from_local_path ("/proc/cpuinfo");
-
- result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
-@@ -178,6 +188,12 @@
-
- g_strfreev (lines);
- g_free (file);
-+#else
-+ len = sizeof (cpu);
-+
-+ if (sysctlbyname ("hw.clockrate", &cpu, &len, NULL, 0) == -1)
-+ return FALSE;
-+#endif /* __FreeBSD__ */
-
- governor = g_strdup (_("Frequency Scaling Unsupported"));
- freq = parent_class->get_human_readable_freq (cpu * 1000); /* kHz are expected*/
---- cpufreq/src/cpufreq-applet.c.orig Fri Jan 14 23:38:20 2005
-+++ cpufreq/src/cpufreq-applet.c Sun Feb 13 02:58:28 2005
-@@ -25,6 +25,10 @@
+ #include <config.h>
+@@ -25,6 +26,10 @@
#include <panel-applet-gconf.h>
#include <glade/glade.h>
#include <glib/gi18n.h>
@@ -471,15 +481,15 @@
#include <string.h>
#include "cpufreq-applet.h"
-@@ -192,6 +196,7 @@
+@@ -192,6 +197,7 @@
{
static const gchar *authors[] = {
"Carlos Garcia Campos <carlosgc@gnome.org>",
-+ "Joe Marcus Clarke <marcus@FreeBSD.org>",
++ "Joe Marcus Clarke <marcus@FreeBSD.org> (FreeBSD support)",
NULL
};
static const gchar *documenters[] = {
-@@ -231,6 +236,7 @@
+@@ -231,6 +237,7 @@
cpufreq_applet_get_max_cpu ()
{
gint mcpu = -1;
@@ -487,12 +497,11 @@
gchar *file = NULL;
do {
-@@ -253,6 +259,15 @@
+@@ -253,6 +260,14 @@
} while (g_file_test (file, G_FILE_TEST_EXISTS));
g_free (file);
mcpu --;
+#else
-+ gint mib[2];
+ size_t len;
+
+ len = sizeof (mcpu);
diff --git a/x11/gnome-applets/files/patch-cpufreq-selector-freebsd b/x11/gnome-applets/files/patch-cpufreq-selector-freebsd
new file mode 100644
index 000000000..f577a0fed
--- /dev/null
+++ b/x11/gnome-applets/files/patch-cpufreq-selector-freebsd
@@ -0,0 +1,373 @@
+--- cpufreq/src/cpufreq-selector/Makefile.in.orig Mon Feb 14 00:26:10 2005
++++ cpufreq/src/cpufreq-selector/Makefile.in Mon Feb 14 00:26:58 2005
+@@ -53,7 +53,7 @@
+ PROGRAMS = $(bin_PROGRAMS)
+ am_cpufreq_selector_OBJECTS = cpufreq.$(OBJEXT) \
+ cpufreq-sysfs.$(OBJEXT) cpufreq-procfs.$(OBJEXT) \
+- main.$(OBJEXT)
++ cpufreq-sysctl.$(OBJEXT) main.$(OBJEXT)
+ cpufreq_selector_OBJECTS = $(am_cpufreq_selector_OBJECTS)
+ am__DEPENDENCIES_1 =
+ cpufreq_selector_DEPENDENCIES = $(am__DEPENDENCIES_1)
+@@ -61,6 +61,7 @@
+ depcomp = $(SHELL) $(top_srcdir)/depcomp
+ am__depfiles_maybe = depfiles
+ @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/cpufreq-procfs.Po \
++@AMDEP_TRUE@ ./$(DEPDIR)/cpufreq-sysctl.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/cpufreq-sysfs.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/cpufreq.Po ./$(DEPDIR)/main.Po
+ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+@@ -310,6 +311,7 @@
+ cpufreq.c cpufreq.h \
+ cpufreq-sysfs.c cpufreq-sysfs.h \
+ cpufreq-procfs.c cpufreq-procfs.h \
++ cpufreq-sysctl.c cpufreq-sysctl.h \
+ main.c
+
+ cpufreq_selector_LDADD = $(CPUFREQ_SELECTOR_LIBS) -lpopt
+@@ -385,6 +387,7 @@
+ -rm -f *.tab.c
+
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-procfs.Po@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-sysctl.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq-sysfs.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpufreq.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
+--- cpufreq/src/cpufreq-selector/cpufreq-sysctl.h.orig Mon Feb 14 00:38:57 2005
++++ cpufreq/src/cpufreq-selector/cpufreq-sysctl.h Mon Feb 14 00:21:39 2005
+@@ -0,0 +1,51 @@
++/*
++ * Copyright (C) 2001, 2002 Free Software Foundation
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Authors : Joe Marcus Clarke <marcus@FreeBSD.org>
++ */
++
++#ifndef __CPUFREQ_SYSCTL_H__
++#define __CPUFREQ_SYSCTL_H__
++
++#include <glib-object.h>
++
++#include "cpufreq.h"
++
++#define TYPE_CPUFREQ_SYSCTL (cpufreq_sysctl_get_type ())
++#define CPUFREQ_SYSCTL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctl))
++#define CPUFREQ_SYSCTL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlClass))
++#define IS_CPUFREQ_SYSCTL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CPUFREQ_SYSCTL))
++#define IS_CPUFREQ_SYSCTL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CPUFREQ_SYSCTL))
++#define CPUFREQ_SYSCTL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlClass))
++
++typedef struct _CPUFreqSysctl CPUFreqSysctl;
++typedef struct _CPUFreqSysctlClass CPUFreqSysctlClass;
++typedef struct _CPUFreqSysctlPriv CPUFreqSysctlPriv;
++
++struct _CPUFreqSysctl {
++ CPUFreq parent;
++};
++
++struct _CPUFreqSysctlClass {
++ CPUFreqClass parent_class;
++};
++
++
++GType cpufreq_sysctl_get_type ();
++CPUFreqSysctl *cpufreq_sysctl_new ();
++
++#endif /* __CPUFREQ_SYSCTL_H__ */
+--- cpufreq/src/cpufreq-selector/main.c.orig Mon Feb 14 00:22:12 2005
++++ cpufreq/src/cpufreq-selector/main.c Mon Feb 14 00:26:04 2005
+@@ -16,6 +16,7 @@
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Authors : Carlos García Campos <carlosgc@gnome.org>
++ * Joe Marcus Clarke <marcus@FreeBSD.org>
+ */
+
+ #include <glib-object.h>
+@@ -26,6 +27,9 @@
+ #include "cpufreq.h"
+ #include "cpufreq-sysfs.h"
+ #include "cpufreq-procfs.h"
++#ifdef __FreeBSD__
++#include "cpufreq-sysctl.h"
++#endif /* __FreeBSD__ */
+
+ gint
+ main (gint argc, gchar **argv)
+@@ -35,6 +39,9 @@
+ gulong frequency = 0;
+ poptContext ctx;
+ gint nextopt;
++#ifdef __FreeBSD__
++ size_t len;
++#endif /* __FreeBSD__ */
+ CPUFreq *cfq;
+
+ struct poptOption options[] = {
+@@ -76,10 +83,15 @@
+
+ poptFreeContext(ctx);
+
++#ifndef __FreeBSD__
+ if (g_file_test ("/sys/devices/system/cpu/cpu0/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.6 kernel */
+ cfq = CPUFREQ (cpufreq_sysfs_new ());
+ } else if (g_file_test ("/proc/cpufreq", G_FILE_TEST_EXISTS)) { /* 2.4 kernel */
+ cfq = CPUFREQ (cpufreq_procfs_new ());
++#else
++ if (sysctlbyname ("dev.cpu.0.freq", NULL, &len, NULL, 0) == 0) {
++ cfq = CPUFREQ (cpufreq_sysctl_new ());
++#endif /* __FreeBSD __ */
+ } else {
+ g_print ("No cpufreq support\n");
+ return 1;
+--- cpufreq/src/cpufreq-selector/cpufreq-sysctl.c.orig Mon Feb 14 00:38:52 2005
++++ cpufreq/src/cpufreq-selector/cpufreq-sysctl.c Mon Feb 14 00:44:43 2005
+@@ -0,0 +1,235 @@
++/*
++ * Copyright (C) 2001, 2002 Free Software Foundation
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Authors : Joe Marcus Clarke <marcus@FreeBSD.org>
++ */
++
++#include <glib.h>
++#include <stdio.h>
++#include <stdlib.h>
++
++#ifdef __FreeBSD__
++#include <sys/types.h>
++#include <sys/sysctl.h>
++#endif /* __FreeBSD__ */
++
++#include "cpufreq-sysctl.h"
++
++#define PARENT_TYPE TYPE_CPUFREQ
++
++#define CPUFREQ_SYSCTL_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), TYPE_CPUFREQ_SYSCTL, CPUFreqSysctlPrivate))
++
++static void cpufreq_sysctl_init (CPUFreqSysctl *cfq);
++static void cpufreq_sysctl_class_init (CPUFreqSysctlClass *klass);
++static void cpufreq_sysctl_finalize (GObject *object);
++
++static void cpufreq_sysctl_set_governor (CPUFreq *cfq, const gchar *governor);
++static void cpufreq_sysctl_set_frequency (CPUFreq *cfq, gint frequency);
++
++static void cpufreq_sysctl_setup (CPUFreqSysctl *cfq);
++
++static GObjectClass *parent_class = NULL;
++
++typedef struct _CPUFreqSysctlPrivate CPUFreqSysctlPrivate;
++
++struct _CPUFreqSysctlPrivate
++{
++ gint pmax;
++};
++
++GType cpufreq_sysctl_get_type ()
++{
++ static GType type = 0;
++
++ if (!type) {
++ static const GTypeInfo info = {
++ sizeof (CPUFreqSysctlClass),
++ (GBaseInitFunc) NULL,
++ (GBaseFinalizeFunc) NULL,
++ (GClassInitFunc) cpufreq_sysctl_class_init,
++ NULL,
++ NULL,
++ sizeof (CPUFreqSysctl),
++ 0,
++ (GInstanceInitFunc) cpufreq_sysctl_init
++ };
++
++ type = g_type_register_static (PARENT_TYPE, "CPUFreqSysctl",
++ &info, 0);
++ }
++
++ return type;
++}
++
++static void
++cpufreq_sysctl_init (CPUFreqSysctl *cfq)
++{
++ CPUFreqSysctlPrivate *private;
++
++ g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq));
++
++ private = CPUFREQ_SYSCTL_GET_PRIVATE (cfq);
++}
++
++static void
++cpufreq_sysctl_class_init (CPUFreqSysctlClass *klass)
++{
++ GObjectClass *object_class = G_OBJECT_CLASS (klass);
++ CPUFreqClass *cfq_class = CPUFREQ_CLASS (klass);
++
++ parent_class = g_type_class_peek_parent (klass);
++
++ g_type_class_add_private (klass, sizeof (CPUFreqSysctlPrivate));
++
++ cfq_class->set_governor = cpufreq_sysctl_set_governor;
++ cfq_class->set_frequency = cpufreq_sysctl_set_frequency;
++
++ object_class->finalize = cpufreq_sysctl_finalize;
++}
++
++static void
++cpufreq_sysctl_finalize (GObject *object)
++{
++ if (G_OBJECT_CLASS (parent_class)->finalize)
++ (* G_OBJECT_CLASS (parent_class)->finalize) (object);
++}
++
++CPUFreqSysctl *
++cpufreq_sysctl_new ()
++{
++ CPUFreqSysctl *cfq;
++
++ cfq = g_object_new (TYPE_CPUFREQ_SYSCTL, NULL);
++
++ cpufreq_sysctl_setup (cfq);
++
++ return cfq;
++}
++
++static void
++cpufreq_sysctl_set_governor (CPUFreq *cfq, const gchar *governor)
++{
++ /* Not implemented. */
++}
++
++static void
++cpufreq_sysctl_set_frequency (CPUFreq *cfq, gint frequency)
++{
++ gint cpu, i;
++ size_t len;
++ gchar *freq_oid;
++
++ g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq));
++
++ g_object_get (G_OBJECT (cfq), "n_cpu", &cpu, NULL);
++
++ frequency = (gint) ((gdouble) frequency / 1000); /* Convert back to MHz*/
++
++ for (i = 0; i < cpu; i++) {
++ freq_oid = g_strdup_printf ("dev.cpu.%d.freq", i);
++
++ sysctlbyname (freq_oid, NULL, &len, &frequency, sizeof (frequency));
++ g_free (freq_oid);
++ }
++}
++
++
++static void
++cpufreq_sysctl_setup (CPUFreqSysctl *cfq)
++{
++ guint cpu;
++ gint fmax, fmin;
++ gint pmax;
++ gint ifreq;
++ gint mib[4];
++ gchar *governor, *levels;
++ gchar **levelsp, **frpr, **l;
++ size_t len;
++ CPUFreqSysctlPrivate *private;
++
++ g_return_if_fail (IS_CPUFREQ_SYSCTL (cfq));
++
++ private = CPUFREQ_SYSCTL_GET_PRIVATE (cfq);
++
++ pmax = 100;
++ fmax = 0;
++ fmin = 0;
++ ifreq = 0;
++
++ private->pmax = pmax;
++
++ len = sizeof (cpu);
++
++ if (sysctlbyname ("hw.ncpu", &cpu, &len, NULL, 0) == -1)
++ cpu = 1;
++
++ len = 4;
++ sysctlnametomib ("dev.cpu.0.freq_levels", mib, &len);
++ len = sizeof (levels);
++
++ if (sysctl (mib, 4, NULL, &len, NULL, 0) == -1) {
++ g_warning ("Failed to fetch dev.cpu.0.freq_levels");
++ return;
++ }
++
++ levels = g_malloc (len);
++ if (sysctl (mib, 4, levels, &len, NULL, 0) == -1) {
++ g_warning ("Failed to fetch data for dev.cpu.0.freq_levels");
++ return;
++ }
++
++ levelsp = g_strsplit (levels, " ", 0);
++ g_free (levels);
++
++ frpr = g_strsplit (levelsp[0], "/", 0); /* MAX */
++ if (frpr && frpr[0] != NULL)
++ fmax = atoi (frpr[0]);
++ g_strfreev (frpr);
++
++ for (l = levelsp; l && *l; l++) /* Walk to the last frequency */
++ ;
++
++ l --;
++ frpr = g_strsplit (*l, "/", 0);
++ if (frpr && frpr[0] != NULL)
++ fmin = atoi (frpr[0]);
++
++ g_strfreev (frpr);
++ g_strfreev (levelsp);
++
++ len = sizeof (ifreq);
++ if (sysctlbyname ("dev.cpu.0.freq", &ifreq, &len, NULL, 0) == -1) {
++ g_warning ("Failed to fetch data for dev.cpu.0.freq");
++ return;
++ }
++
++ if (ifreq == fmax)
++ governor = g_strdup ("performance");
++ else if (ifreq == fmin)
++ governor = g_strdup ("economy");
++ else
++ governor = g_strdup ("other");
++
++ fmax *= 1000;
++ fmin *= 1000;
++
++ g_object_set (G_OBJECT (cfq), "n_cpu", cpu,
++ "sc_max", fmax, "sc_min", fmin,
++ "governor", governor, NULL);
++
++ g_free (governor);
++}