aboutsummaryrefslogtreecommitdiff
path: root/src/ss/os.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ss/os.c')
-rw-r--r--src/ss/os.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/ss/os.c b/src/ss/os.c
new file mode 100644
index 0000000..d232a1f
--- /dev/null
+++ b/src/ss/os.c
@@ -0,0 +1,91 @@
+#include <glib.h>
+#include "zenmonitor.h"
+#include "sysfs.h"
+#include "os.h"
+
+#define OS_FREQ_PRINTF_FORMAT " %8.3f GHz"
+
+static gchar **frq_files = NULL;
+static guint cores;
+
+gfloat *core_freq;
+gfloat *core_freq_min;
+gfloat *core_freq_max;
+
+static gdouble get_frequency(guint coreid) {
+ gchar *data;
+ if (!g_file_get_contents(frq_files[coreid], &data, NULL, NULL))
+ return 0.0;
+
+ return atoi(data) / 1000000.0;
+}
+
+gboolean os_init() {
+ gshort *cpu_dev_ids = NULL;
+ gint i;
+
+ if (!check_zen())
+ return FALSE;
+
+ cores = get_core_count();
+ if (cores == 0)
+ return FALSE;
+
+ cpu_dev_ids = get_cpu_dev_ids();
+ frq_files = malloc(cores * sizeof (gchar*));
+ for (i = 0; i < cores; i++) {
+ frq_files[i] = g_strdup_printf(
+ "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq",
+ cpu_dev_ids[i]);
+ }
+ g_free(cpu_dev_ids);
+
+ core_freq = malloc(cores * sizeof (gfloat));
+ core_freq_min = malloc(cores * sizeof (gfloat));
+ core_freq_max = malloc(cores * sizeof (gfloat));
+
+ os_update();
+ memcpy(core_freq_min, core_freq, cores * sizeof (gfloat));
+ memcpy(core_freq_max, core_freq, cores * sizeof (gfloat));
+
+ return TRUE;
+}
+
+void os_update() {
+ gint i;
+
+ for (i = 0; i < cores; i++) {
+ core_freq[i] = get_frequency(i);
+ if (core_freq[i] < core_freq_min[i])
+ core_freq_min[i] = core_freq[i];
+ if (core_freq[i] > core_freq_max[i])
+ core_freq_max[i] = core_freq[i];
+ }
+}
+
+void os_clear_minmax() {
+ gint i;
+
+ for (i = 0; i < cores; i++) {
+ core_freq_min[i] = core_freq[i];
+ core_freq_max[i] = core_freq[i];
+ }
+}
+
+GSList* os_get_sensors() {
+ GSList *list = NULL;
+ SensorInit *data;
+ gint i;
+
+ for (i = 0; i < cores; i++) {
+ data = sensor_init_new();
+ data->label = g_strdup_printf("Core %d Frequency", i);
+ data->value = &(core_freq[i]);
+ data->min = &(core_freq_min[i]);
+ data->max = &(core_freq_max[i]);
+ data->printf_format = OS_FREQ_PRINTF_FORMAT;
+ list = g_slist_append(list, data);
+ }
+
+ return list;
+}