sysinfo: Use unifed API for querrying CPU state.

Summary:
This finally got unified. Fix for the CPU gadget within
sysinfo. One API for MP and SP machines.

Reviewers: raster, cedric, stephenmhouston, devilhorns

Subscribers: zmike

Tags: #enlightenment-git

Differential Revision: https://phab.enlightenment.org/D9023
This commit is contained in:
Charlie Root 2019-06-03 10:48:28 +01:00 committed by Carsten Haitzler (Rasterman)
parent 4c12625cab
commit 61d45313c4
1 changed files with 24 additions and 52 deletions

View File

@ -7,6 +7,7 @@
#endif #endif
#if defined(__OpenBSD__) #if defined(__OpenBSD__)
# include <sys/sched.h>
# include <sys/sysctl.h> # include <sys/sysctl.h>
# define CPU_STATES 6 # define CPU_STATES 6
#endif #endif
@ -78,71 +79,42 @@ _cpumonitor_sysctl_getusage(unsigned long *prev_total, unsigned long *prev_idle,
*prev_percent = (int)(percent_all / ncpu); *prev_percent = (int)(percent_all / ncpu);
#elif defined(__OpenBSD__) #elif defined(__OpenBSD__)
int ncpu = _cpumonitor_sysctl_getcores(); int ncpu = _cpumonitor_sysctl_getcores();
struct cpustats cpu_times[CPU_STATES];
memset(&cpu_times, 0, CPU_STATES * sizeof(struct cpustats));
if (!ncpu) return; if (!ncpu) return;
if (ncpu == 1) for (i = 0; i < ncpu; i++)
{ {
unsigned long cpu_times[CPU_STATES]; unsigned long total = 0, idle;
int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME }; int diff_total, diff_idle;
size = CPU_STATES * sizeof(unsigned long); int cpu_time_mib[] = { CTL_KERN, KERN_CPUSTATS, 0 };
if (sysctl(cpu_time_mib, 2, &cpu_times, &size, NULL, 0) < 0)
size = sizeof(struct cpustats);
cpu_time_mib[2] = i;
if (sysctl(cpu_time_mib, 3, &cpu_times[i], &size, NULL, 0) < 0)
return; return;
unsigned long total = 0; for (j = 0; j < CPU_STATES; j++)
for (j = 0; j < CPU_STATES - 1; j++) total += cpu_times[i].cs_time[j];
total += cpu_times[j];
unsigned long idle = cpu_times[4]; idle = cpu_times[i].cs_time[CP_IDLE];
core = eina_list_nth(cores, i);
diff_total = total - core->total;
diff_idle = idle - core->idle;
int diff_total = total - *prev_total; core->total = total;
int diff_idle = idle - *prev_idle; core->idle = idle;
if (diff_total == 0) diff_total = 1; if (diff_total == 0) diff_total = 1;
double ratio = diff_total / 100.0; double ratio = diff_total / 100;
unsigned long used = diff_total - diff_idle; unsigned long used = diff_total - diff_idle;
int percent = used / ratio; int percent = used / ratio;
if (percent > 100)
percent = 100;
else if (percent < 0)
percent = 0;
*prev_total = total; core->percent = percent;
*prev_idle = idle; // cpu_times[3];
*prev_percent = (int)percent;
}
else if (ncpu > 1)
{
for (i = 0; i < ncpu; i++)
{
unsigned long cpu_times[CPU_STATES];
size = CPU_STATES * sizeof(unsigned long);
int cpu_time_mib[] = { CTL_KERN, KERN_CPTIME2, 0 };
cpu_time_mib[2] = i;
if (sysctl(cpu_time_mib, 3, &cpu_times, &size, NULL, 0) < 0)
return;
unsigned long total = 0; percent_all += (int)percent;
for (j = 0; j < CPU_STATES - 1; j++) total_all += total;
total += cpu_times[j]; idle_all += core->idle;
core = eina_list_nth(cores, i);
int diff_total = total - core->total;
int diff_idle = cpu_times[4] - core->idle;
core->total = total;
core->idle = cpu_times[4];
if (diff_total == 0) diff_total = 1;
double ratio = diff_total / 100;
unsigned long used = diff_total - diff_idle;
int percent = used / ratio;
core->percent = percent;
percent_all += (int)percent;
total_all += total;
idle_all += core->idle;
}
*prev_total = (total_all / ncpu); *prev_total = (total_all / ncpu);
*prev_idle = (idle_all / ncpu); *prev_idle = (idle_all / ncpu);