--- 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.4Received 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