| 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 |
} |
|---|