root/mh-home-sysmon/trunk/mh-cpu-source.c

Revision 96, 1.4 kB (checked in by inz, 6 months ago)

Handle backgrounding and display off. Fix file descriptor leak.

Line 
1 #include <stdio.h>
2 #include <glib.h>
3 #include "datasource.h"
4 #include "mh-cpu-source.h"
5
6 typedef struct _MhCpuSourceData MhCpuSourceData;
7 struct _MhCpuSourceData {
8         guint prev;
9         guint prev_idle;
10 };
11
12 static void *mh_cpu_source_init(DataSource *data_source);
13 static double mh_cpu_source_get_value(void *ds_data);
14 static void mh_cpu_source_deinit(void *ds_data);
15
16 void mh_cpu_source_load(DataSource *data_source)
17 {
18         data_source->init = mh_cpu_source_init;
19         data_source->get_value = mh_cpu_source_get_value;
20         data_source->deinit = mh_cpu_source_deinit;
21
22         data_source->name = "CPU load";
23         data_source->max_text = "<b>100%</b>";
24         data_source->half_text = "<b>50%</b>";
25         data_source->min_text = "<b>0%</b>";
26 }
27
28 static void *mh_cpu_source_init(DataSource *data_source)
29 {
30         MhCpuSourceData *data = g_new0(MhCpuSourceData, 1);
31
32         (void)data_source;
33
34         data->prev = 0;
35
36         return data;
37 }
38
39 static double mh_cpu_source_get_value(void *ds_data)
40 {
41         MhCpuSourceData *data = ds_data;
42         guint user, nice, kern, idle, change, change_idle;
43         FILE *proc_stat = fopen("/proc/stat", "r");
44         fscanf(proc_stat, "cpu %u %u %u %u", &user, &nice, &kern, &idle);
45         fclose(proc_stat);
46
47         change = user + nice + kern + idle - data->prev;
48         data->prev = user + nice + kern + idle;
49         change_idle = idle - data->prev_idle;
50         data->prev_idle = idle;
51
52         return (double)(change - change_idle) / change;
53 }
54
55 static void mh_cpu_source_deinit(void *ds_data)
56 {
57         g_free(ds_data);
58 }
Note: See TracBrowser for help on using the browser.