From 1512a0bda07e292cb30b1a75149ac8d199794f49 Mon Sep 17 00:00:00 2001 From: "Pawel \"l0ner\" Soltys" Date: Mon, 16 Feb 2015 23:29:27 +0100 Subject: [PATCH] NetBSD port. NetBSD port shares with FreeBSD: - load_string() - getsysctl() With OpenBSD: - error() --- CMakeLists.txt | 2 ++ {openbsd => common}/error.h | 3 +- common/main.cc | 36 +++++++++++---------- freebsd/getsysctl.h | 4 ++- netbsd/cpu.cc | 57 +++++++++++++++++++++++++++++++++ netbsd/cpu.h | 31 ++++++++++++++++++ netbsd/memory.cc | 64 +++++++++++++++++++++++++++++++++++++ netbsd/memory.h | 26 +++++++++++++++ 8 files changed, 205 insertions(+), 18 deletions(-) rename {openbsd => common}/error.h (94%) create mode 100644 netbsd/cpu.cc create mode 100644 netbsd/cpu.h create mode 100644 netbsd/memory.cc create mode 100644 netbsd/memory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b49801..372229e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "OpenBSD") if(CMAKE_SYSTEM_VERSION VERSION_LESS 5.7) add_definitions(-DOPENBSD_WORKAROUND=1) endif() +elseif(CMAKE_SYSTEM_NAME MATCHES "NetBSD") + set(METER_SOURCES "netbsd/memory.cc" "netbsd/cpu.cc" "freebsd/load.cc") else() message(FATAL_ERROR "Cannot be compiled on this system") endif() diff --git a/openbsd/error.h b/common/error.h similarity index 94% rename from openbsd/error.h rename to common/error.h index b4c6a7e..f771c41 100644 --- a/openbsd/error.h +++ b/common/error.h @@ -23,6 +23,7 @@ #include #include #include // strerror +#include // exit() inline void error( const char * error ) { @@ -30,7 +31,7 @@ inline void error( const char * error ) using std::endl; cerr << error << ": " << strerror( errno ) << endl; - exit( 23 ); + exit( EXIT_FAILURE ); } #endif diff --git a/common/main.cc b/common/main.cc index e1bd9ba..33c5d8f 100644 --- a/common/main.cc +++ b/common/main.cc @@ -31,25 +31,29 @@ #if defined(__APPLE__) && defined(__MACH__) // Apple osx system - #include "osx/cpu.h" - #include "osx/memory.h" - #include "osx/load.h" + #include "osx/cpu.h" + #include "osx/memory.h" + #include "osx/load.h" #elif defined(__FreeBSD__) || defined(__NetBSD__) // BSD system - #define BSD_BASED 1 - #include "freebsd/cpu.h" - #include "freebsd/load.h" - #include "freebsd/memory.h" -#elif defined(__OpenBSD) - #define BSD_BASED 1 - #include "freebsd/cpu.h" - #include "freebsd/load.h" - #include "freebsd/memory.h" + #define BSD_BASED 1 + #include "freebsd/cpu.h" + #include "freebsd/load.h" + #include "freebsd/memory.h" +#elif defined(__OpenBSD__) + #define BSD_BASED 1 + #include "freebsd/cpu.h" + #include "freebsd/load.h" + #include "freebsd/memory.h" +#elif defined(__NetBSD__) + #include "freebsd/cpu.h" + #include "freebsd/load.h" + #include "netbsd/memory.h" #else - // assume linux system - #include "linux/cpu.h" - #include "linux/memory.h" - #include "linux/load.h" + // assume linux system + #include "linux/cpu.h" + #include "linux/memory.h" + #include "linux/load.h" #endif std::string cpu_string( unsigned int cpu_usage_delay, unsigned int graph_lines, diff --git a/freebsd/getsysctl.h b/freebsd/getsysctl.h index aecd004..e97f9ee 100644 --- a/freebsd/getsysctl.h +++ b/freebsd/getsysctl.h @@ -26,6 +26,8 @@ #include #include #include +#include //exit() +#include //strerror() #define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var)) static inline void getsysctl( const char *name, void *ptr, size_t len ) @@ -36,7 +38,7 @@ static inline void getsysctl( const char *name, void *ptr, size_t len ) { std::cerr << "sysctl(" << name << "...) failed: " << strerror( errno ) << std::endl; - exit( 23 ); + exit( EXIT_FAILURE ); } if( nlen != len ) diff --git a/netbsd/cpu.cc b/netbsd/cpu.cc new file mode 100644 index 0000000..2afab53 --- /dev/null +++ b/netbsd/cpu.cc @@ -0,0 +1,57 @@ +/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap + * + * Copyright 2012 Matthew McCormick + * Copyright 2013 Justin Crawford + * Copyright 2015 Pawel 'l0ner' Soltys + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Based on: github.com/freebsd/freebsd/blob/master/usr.bin/top/machine.c +// Based on: Apple.cpp for load_string/mem_string and apple's documentation + +#include +#include // usleep + +#include "../freebsd/getsysctl.h" +#include "cpu.h" + +float cpu_percentage( unsigned int cpu_usage_delay ) +{ + u_int64_t load1[CPUSTATES]; + u_int64_t load2[CPUSTATES]; + + GETSYSCTL( "kern.cp_time", load1 ); + usleep( cpu_usage_delay ); + GETSYSCTL( "kern.cp_time", load2 ); + + // Current load times + unsigned long long current_user = load1[CP_USER]; + unsigned long long current_system = load1[CP_SYS]; + unsigned long long current_nice = load1[CP_NICE]; + unsigned long long current_idle = load1[CP_IDLE]; + // Next load times + unsigned long long next_user = load2[CP_USER]; + unsigned long long next_system = load2[CP_SYS]; + unsigned long long next_nice = load2[CP_NICE]; + unsigned long long next_idle = load2[CP_IDLE]; + // Difference between the two + unsigned long long diff_user = next_user - current_user; + unsigned long long diff_system = next_system - current_system; + unsigned long long diff_nice = next_nice - current_nice; + unsigned long long diff_idle = next_idle - current_idle; + + return static_cast( diff_user + diff_system + diff_nice ) / + static_cast( diff_user + diff_system + diff_nice + diff_idle ) * + 100.0; +} diff --git a/netbsd/cpu.h b/netbsd/cpu.h new file mode 100644 index 0000000..3840650 --- /dev/null +++ b/netbsd/cpu.h @@ -0,0 +1,31 @@ +/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap + * + * Copyright 2012 Matthew McCormick + * Copyright 2015 Pawel 'l0ner' Soltys + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef CPU_H_ +#define CPU_H_ + +#define CP_USER 0 +#define CP_NICE 1 +#define CP_SYS 2 +#define CP_INTR 3 +#define CP_IDLE 4 +#define CPUSTATES 5 + +float cpu_percentage( unsigned ); + +#endif diff --git a/netbsd/memory.cc b/netbsd/memory.cc new file mode 100644 index 0000000..d27bb44 --- /dev/null +++ b/netbsd/memory.cc @@ -0,0 +1,64 @@ +/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap + * + * Copyright 2012 Matthew McCormick + * Copyright 2015 Pawel 'l0ner' Soltys + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include +#include +#include // uvmexp struct + +#include "error.h" +#include "luts.h" +#include "conversions.h" +#include "memory.h" + +std::string mem_string( bool use_colors = false ) +{ + std::ostringstream oss; + + // get vm memory stats + static int vm_totalmem[] = { CTL_VM, VM_UVMEXP2 }; + struct uvmexp_sysctl mem; + size_t size = sizeof( mem ); + if( sysctl( vm_totalmem, 2, &mem, &size, NULL, 0 ) < 0 ) + { + error( "memory: error getting vm memory stats" ); + } + + int64_t total_mem = ( mem.npages << mem.pageshift ); + int64_t used_mem = + ( mem.active + mem.wired - mem.filepages ) << mem.pageshift; + + if( use_colors ) + { + oss << mem_lut[( 100 * used_mem ) / total_mem]; + } + + // add 1 to used which gets lost somewhere along conversions + oss << convert_unit( used_mem, MEGABYTES ) + << '/' << convert_unit( total_mem, MEGABYTES ) << "MB"; + + if( use_colors ) + { + oss << "#[fg=default,bg=default]"; + } + + return oss.str(); + +} diff --git a/netbsd/memory.h b/netbsd/memory.h new file mode 100644 index 0000000..3a123bb --- /dev/null +++ b/netbsd/memory.h @@ -0,0 +1,26 @@ +/* vim: tabstop=2 shiftwidth=2 expandtab textwidth=80 linebreak wrap + * + * Copyright 2012 Matthew McCormick + * Copyright 2015 Pawel 'l0ner' Soltys + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MEMORY_H_ +#define MEMORY_H_ + +#include + +std::string mem_string( bool ); + +#endif