commit 120d15059425b522db464e6f3f857bee4a781cce
parent ec306623df7321a4e6ec11f70b6152a2e614d1ed
Author: Michael Buch <michaelbuch12@gmail.com>
Date: Tue, 5 Feb 2019 02:44:37 +0000
Add support for cpu and uptime components on FreeBSD
Diffstat:
2 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/components/cpu.c b/components/cpu.c
@@ -103,4 +103,54 @@
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
b[CP_INTR] + b[CP_IDLE])));
}
+#elif defined(__FreeBSD__)
+ #include <sys/param.h>
+ #include <sys/sysctl.h>
+ #include <devstat.h>
+
+ const char *
+ cpu_freq(void)
+ {
+ int freq;
+ size_t size;
+
+ size = sizeof(freq);
+ /* in MHz */
+ if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) == -1
+ || !size) {
+ warn("sysctlbyname 'hw.clockrate':");
+ return NULL;
+ }
+
+ return fmt_human(freq * 1E6, 1000);
+ }
+
+ const char *
+ cpu_perc(void)
+ {
+ size_t size;
+ static long a[CPUSTATES];
+ long b[CPUSTATES];
+
+ size = sizeof(a);
+ memcpy(b, a, sizeof(b));
+ if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) == -1
+ || !size) {
+ warn("sysctlbyname 'kern.cp_time':");
+ return NULL;
+ }
+ if (b[0] == 0) {
+ return NULL;
+ }
+
+ return bprintf("%d", 100 *
+ ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
+ a[CP_INTR]) -
+ (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
+ b[CP_INTR])) /
+ ((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
+ a[CP_INTR] + a[CP_IDLE]) -
+ (b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
+ b[CP_INTR] + b[CP_IDLE])));
+ }
#endif
diff --git a/components/uptime.c b/components/uptime.c
@@ -5,14 +5,24 @@
#include "../util.h"
+#if defined(CLOCK_BOOTTIME)
+ #define UPTIME_FLAG CLOCK_BOOTTIME
+#elif defined(CLOCK_UPTIME)
+ #define UPTIME_FLAG CLOCK_UPTIME
+#else
+ #define UPTIME_FLAG CLOCK_MONOTONIC
+#endif
+
const char *
uptime(void)
{
+ char warn_buf[256];
uintmax_t h, m;
struct timespec uptime;
- if (clock_gettime(CLOCK_BOOTTIME, &uptime) < 0) {
- warn("clock_gettime 'CLOCK_BOOTTIME'");
+ if (clock_gettime(UPTIME_FLAG, &uptime) < 0) {
+ snprintf(warn_buf, 256, "clock_gettime %d", UPTIME_FLAG);
+ warn(warn_buf);
return NULL;
}