suckless/slstatus

components/cpu.c in master
Repositories | Summary | Log | Files | README | LICENSE

cpu.c (3434B) download


  1/* See LICENSE file for copyright and license details. */
  2#include <stdint.h>
  3#include <stdio.h>
  4#include <string.h>
  5
  6#include "../slstatus.h"
  7#include "../util.h"
  8
  9#if defined(__linux__)
 10	#define CPU_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
 11
 12	const char *
 13	cpu_freq(const char *unused)
 14	{
 15		uintmax_t freq;
 16
 17		/* in kHz */
 18		if (pscanf(CPU_FREQ, "%ju", &freq) != 1)
 19			return NULL;
 20
 21		return fmt_human(freq * 1000, 1000);
 22	}
 23
 24	const char *
 25	cpu_perc(const char *unused)
 26	{
 27		static long double a[7];
 28		long double b[7], sum;
 29
 30		memcpy(b, a, sizeof(b));
 31		/* cpu user nice system idle iowait irq softirq */
 32		if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf",
 33		           &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])
 34		    != 7)
 35			return NULL;
 36
 37		if (b[0] == 0)
 38			return NULL;
 39
 40		sum = (b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6]) -
 41		      (a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6]);
 42
 43		if (sum == 0)
 44			return NULL;
 45
 46		return bprintf("%d", (int)(100 *
 47		               ((b[0] + b[1] + b[2] + b[5] + b[6]) -
 48		                (a[0] + a[1] + a[2] + a[5] + a[6])) / sum));
 49	}
 50#elif defined(__OpenBSD__)
 51	#include <sys/param.h>
 52	#include <sys/sched.h>
 53	#include <sys/sysctl.h>
 54
 55	const char *
 56	cpu_freq(const char *unused)
 57	{
 58		int freq, mib[2];
 59		size_t size;
 60
 61		mib[0] = CTL_HW;
 62		mib[1] = HW_CPUSPEED;
 63
 64		size = sizeof(freq);
 65
 66		/* in MHz */
 67		if (sysctl(mib, 2, &freq, &size, NULL, 0) < 0) {
 68			warn("sysctl 'HW_CPUSPEED':");
 69			return NULL;
 70		}
 71
 72		return fmt_human(freq * 1E6, 1000);
 73	}
 74
 75	const char *
 76	cpu_perc(const char *unused)
 77	{
 78		int mib[2];
 79		static uintmax_t a[CPUSTATES];
 80		uintmax_t b[CPUSTATES], sum;
 81		size_t size;
 82
 83		mib[0] = CTL_KERN;
 84		mib[1] = KERN_CPTIME;
 85
 86		size = sizeof(a);
 87
 88		memcpy(b, a, sizeof(b));
 89		if (sysctl(mib, 2, &a, &size, NULL, 0) < 0) {
 90			warn("sysctl 'KERN_CPTIME':");
 91			return NULL;
 92		}
 93		if (b[0] == 0)
 94			return NULL;
 95
 96		sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
 97		      (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
 98
 99		if (sum == 0)
100			return NULL;
101
102		return bprintf("%d", 100 *
103		               ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
104		                 a[CP_INTR]) -
105		                (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
106		                 b[CP_INTR])) / sum);
107	}
108#elif defined(__FreeBSD__)
109	#include <devstat.h>
110	#include <sys/param.h>
111	#include <sys/sysctl.h>
112
113	const char *
114	cpu_freq(const char *unused)
115	{
116		int freq;
117		size_t size;
118
119		size = sizeof(freq);
120		/* in MHz */
121		if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) < 0 || !size) {
122			warn("sysctlbyname 'hw.clockrate':");
123			return NULL;
124		}
125
126		return fmt_human(freq * 1E6, 1000);
127	}
128
129	const char *
130	cpu_perc(const char *unused)
131	{
132		size_t size;
133		static long a[CPUSTATES];
134		long b[CPUSTATES], sum;
135
136		size = sizeof(a);
137		memcpy(b, a, sizeof(b));
138		if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) < 0 || !size) {
139			warn("sysctlbyname 'kern.cp_time':");
140			return NULL;
141		}
142		if (b[0] == 0)
143			return NULL;
144
145		sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
146		      (b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
147
148		if (sum == 0)
149			return NULL;
150
151		return bprintf("%d", 100 *
152		               ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
153		                 a[CP_INTR]) -
154		                (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
155		                 b[CP_INTR])) / sum);
156	}
157#endif