[hackers] [slstatus][PATCH] Add support for cpu and uptime components on FreeBSD

From: Michael Buch <michaelbuch12_AT_gmail.com>
Date: Tue, 5 Feb 2019 02:44:37 +0000

---
 FreeBSD port for uptime.c and cpu.c. Tested with assistance
 of htop. CLOCK_BOOTTIME is not necessarily available on
 linux so use it if it exists and otherwise fall back to
 CLOCK_MONOTONIC. FreeBSD has CLOCK_UPTIME.
 components/cpu.c    | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 components/uptime.c | 14 ++++++++++++--
 2 files changed, 62 insertions(+), 2 deletions(-)
diff --git a/components/cpu.c b/components/cpu.c
index d4f8064..9a021d5 100644
--- a/components/cpu.c
+++ b/components/cpu.c
_AT_@ -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
index 978f88f..7c23c98 100644
--- a/components/uptime.c
+++ b/components/uptime.c
_AT_@ -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;
 	}
 
-- 
2.7.4
Received on Tue Feb 05 2019 - 03:44:37 CET

This archive was generated by hypermail 2.3.0 : Tue Feb 05 2019 - 03:48:23 CET