mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-23 19:39:06 +00:00
Conky for mac os master (#579)
* Try to amend #31 * BUILD_WLAN should be available for all OS. Keep BUILD_WLAN OFF by default for compatibility reasons. * WLAN-related variables should be available for every OS. There are some problems (probably null-dereference) * Fix $wireless_essid crashing conky if no argument provided. Conky wasn't parsing the argument of the variable as it should, thus wasn't allocating the `dev` member variable. Also fix some documentation stuff. * Improve `get_freq` #20 Using the Intel® Power Gadget API (https://software.intel.com/en-us/blogs/2012/12/13/using-the-intel-power-gadget-api-on-mac-os-x) we can now get actual Core frequency and not the constant factory one. Though, for some weird reason the API gives the same freq for all Cores, thus the |cpu| arg becomes useless. * Oops, this accidently slipped in * Introduce BUILD_IPGFREQ build option This build option has been introduced for one particular reason: On macOS getting current core-frequency is not supported by the APIs. A solution is to install Intel's ® Power Gadget which comes with an .app, a Framework and a kernel-extension. Though, this may trouble some alot, thus introduce BUILD_IPGFREQ. * Forgot static here. * Some improvements for get_freq again. Fix frequency not printing correctly (I wasn't using the divisor) Add more guards. * Setup cmake files and project code for Objective-C code #17 We want to use CoreWLAN framework. * update_cpu_usage() now supports multiple cores Also, some cleanup. * Updated default conky config to monitor Mac Networking * Made Mac Friendly BuildOptions and generic default conky configs * Undid Xdamage config and cleaned up previous IF statements * Re-Added XDamage fix * Finish up the algorithm. I think its now correct. Closes: #33 * Cleanup macro and introduce a no-op free_cpu() function for ALL cpu-related variables free_cpu() must be implemented for every OS and on all except macOS its a no-op function. * Reformat, add empty comment.
This commit is contained in:
parent
b17f2c2ca9
commit
8aa9c819f3
@ -63,6 +63,12 @@ if (NOT LIB_INSTALL_DIR)
|
||||
endif (NOT LIB_INSTALL_DIR)
|
||||
set(PACKAGE_LIBRARY_DIR "${LIB_INSTALL_DIR}/conky" CACHE STRING "Package library path (where Lua bindings are installed" FORCE)
|
||||
set(DEFAULTNETDEV "eth0" CACHE STRING "Default networkdevice")
|
||||
|
||||
# Mac only override
|
||||
if(OS_DARWIN)
|
||||
set(DEFAULTNETDEV "en0" CACHE STRING "Default networkdevice" FORCE)
|
||||
endif(OS_DARWIN)
|
||||
|
||||
set(XDG_CONFIG_FILE "$HOME/.config/conky/conky.conf" CACHE STRING "Configfile of the user (XDG)")
|
||||
set(CONFIG_FILE "$HOME/.conkyrc" CACHE STRING "Configfile of the user")
|
||||
set(MAX_USER_TEXT_DEFAULT "16384" CACHE STRING "Default maximum size of config TEXT buffer, i.e. below TEXT line.")
|
||||
@ -76,7 +82,6 @@ if(OS_LINUX)
|
||||
option(BUILD_PORT_MONITORS "Build TCP portmon support" true)
|
||||
option(BUILD_IBM "Support for IBM/Lenovo notebooks" true)
|
||||
option(BUILD_HDDTEMP "Support for hddtemp" true)
|
||||
option(BUILD_WLAN "Enable wireless support" false)
|
||||
# nvidia may also work on FreeBSD, not sure
|
||||
option(BUILD_NVIDIA "Enable nvidia support" false)
|
||||
option(BUILD_IPV6 "Enable if you want IPv6 support" true)
|
||||
@ -84,14 +89,20 @@ else(OS_LINUX)
|
||||
set(BUILD_PORT_MONITORS false)
|
||||
set(BUILD_IBM false)
|
||||
set(BUILD_HDDTEMP false)
|
||||
set(BUILD_WLAN false)
|
||||
set(BUILD_NVIDIA false)
|
||||
set(BUILD_IPV6 false)
|
||||
endif(OS_LINUX)
|
||||
|
||||
# macOS Only
|
||||
if(OS_DARWIN)
|
||||
option(BUILD_IPGFREQ "Enable cpu freq calculation based on Intel® Power Gadget; otherwise use constant factory value" false)
|
||||
endif(OS_DARWIN)
|
||||
|
||||
# Optional features etc
|
||||
#
|
||||
|
||||
option(BUILD_WLAN "Enable wireless support" false)
|
||||
|
||||
option(BUILD_BUILTIN_CONFIG "Enable builtin default configuration" true)
|
||||
|
||||
option(BUILD_IOSTATS "Enable disk I/O stats" true)
|
||||
@ -110,7 +121,14 @@ endif(BUILD_NCURSES)
|
||||
option(BUILD_X11 "Build X11 support" true)
|
||||
if(BUILD_X11)
|
||||
option(OWN_WINDOW "Enable own_window support" true)
|
||||
option(BUILD_XDAMAGE "Build Xdamage support" true)
|
||||
|
||||
# Mac Fix
|
||||
if(OS_DARWIN)
|
||||
option(BUILD_XDAMAGE "Build Xdamage support" false)
|
||||
else(OS_DARWIN)
|
||||
option(BUILD_XDAMAGE "Build Xdamage support" true)
|
||||
endif(OS_DARWIN)
|
||||
|
||||
option(BUILD_XINERAMA "Build Xinerama support" true)
|
||||
option(BUILD_XDBE "Build Xdbe (double-buffer) support" true)
|
||||
option(BUILD_XFT "Build Xft (freetype fonts) support" true)
|
||||
|
@ -137,6 +137,16 @@ if(BUILD_NCURSES AND OS_DARWIN)
|
||||
set(conky_libs ${conky_libs} -lncurses)
|
||||
endif(BUILD_NCURSES AND OS_DARWIN)
|
||||
|
||||
if(BUILD_WLAN AND OS_DARWIN)
|
||||
find_library(CW CoreWLAN)
|
||||
set(conky_libs ${conky_libs} ${CW})
|
||||
endif(BUILD_WLAN AND OS_DARWIN)
|
||||
|
||||
if(OS_DARWIN AND BUILD_IPGFREQ)
|
||||
find_library(IPG IntelPowerGadget)
|
||||
set(conky_libs ${conky_libs} ${IPG})
|
||||
endif(OS_DARWIN AND BUILD_IPGFREQ)
|
||||
|
||||
if(BUILD_MATH)
|
||||
set(conky_libs ${conky_libs} -lm)
|
||||
endif(BUILD_MATH)
|
||||
@ -198,7 +208,7 @@ if(BUILD_MYSQL)
|
||||
set(conky_libs ${conky_libs} ${MYSQLCLIENT_LIB})
|
||||
endif(BUILD_MYSQL)
|
||||
|
||||
if(BUILD_WLAN)
|
||||
if(BUILD_WLAN AND OS_LINUX)
|
||||
set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
|
||||
check_include_files(iwlib.h IWLIB_H)
|
||||
if(NOT IWLIB_H)
|
||||
@ -210,7 +220,7 @@ if(BUILD_WLAN)
|
||||
endif(NOT IWLIB_LIB)
|
||||
set(conky_libs ${conky_libs} ${IWLIB_LIB})
|
||||
check_function_exists(iw_sockets_open IWLIB_SOCKETS_OPEN_FUNC)
|
||||
endif(BUILD_WLAN)
|
||||
endif(BUILD_WLAN AND OS_LINUX)
|
||||
|
||||
if(BUILD_PORT_MONITORS)
|
||||
check_function_exists(getnameinfo HAVE_GETNAMEINFO)
|
||||
|
@ -102,6 +102,8 @@
|
||||
|
||||
#cmakedefine BUILD_IOSTATS 1
|
||||
|
||||
#cmakedefine BUILD_IPGFREQ 0
|
||||
|
||||
#cmakedefine BUILD_WLAN 1
|
||||
|
||||
#cmakedefine BUILD_ICAL 1
|
||||
|
@ -72,7 +72,7 @@ $hr
|
||||
${color grey}File systems:
|
||||
/ $color${fs_used /}/${fs_size /} ${fs_bar 6 /}
|
||||
${color grey}Networking:
|
||||
Up:$color ${upspeed eth0} ${color grey} - Down:$color ${downspeed eth0}
|
||||
Up:$color ${upspeed} ${color grey} - Down:$color ${downspeed}
|
||||
$hr
|
||||
${color grey}Name PID CPU% MEM%
|
||||
${color lightgrey} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
|
||||
|
@ -46,7 +46,7 @@ Processes: $processes Running: $running_processes
|
||||
File systems:
|
||||
/ ${fs_used /}/${fs_size /} ${fs_bar 6 /}
|
||||
Networking:
|
||||
Up: ${upspeed eth0} - Down: ${downspeed eth0}
|
||||
Up: ${upspeed} - Down: ${downspeed}
|
||||
Name PID CPU% MEM%
|
||||
${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
|
||||
${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
|
||||
|
@ -4784,7 +4784,7 @@
|
||||
</command>
|
||||
<option>(net)</option>
|
||||
</term>
|
||||
<listitem>WLAN channel on which device 'net' is listening (Linux only)
|
||||
<listitem>WLAN channel on which device 'net' is listening
|
||||
<para /></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
@ -4804,7 +4804,7 @@
|
||||
</command>
|
||||
<option>(net)</option>
|
||||
</term>
|
||||
<listitem>Frequency on which device 'net' is listening (Linux only)
|
||||
<listitem>Frequency on which device 'net' is listening
|
||||
<para /></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
@ -135,7 +135,7 @@ endif(OS_HAIKU)
|
||||
|
||||
if(OS_DARWIN)
|
||||
set(darwin
|
||||
darwin.cc darwin.h
|
||||
darwin.mm darwin.h
|
||||
darwin_sip.h
|
||||
i18n.h
|
||||
)
|
||||
|
@ -158,6 +158,8 @@ uint8_t battery_percentage(struct text_object *);
|
||||
void print_battery_short(struct text_object *, char *, int);
|
||||
#endif /* !__OpenBSD__ */
|
||||
|
||||
void free_cpu(struct text_object *);
|
||||
|
||||
void print_blink(struct text_object *, char *, int);
|
||||
void print_include(struct text_object *, char *, int);
|
||||
|
||||
|
73
src/core.cc
73
src/core.cc
@ -484,42 +484,43 @@ struct text_object *construct_text_object(char *s, const char *arg, long line,
|
||||
obj->data.i = atoi(&arg[0]);
|
||||
}
|
||||
obj->callbacks.print = &print_voltage_v;
|
||||
|
||||
#ifdef BUILD_WLAN
|
||||
END OBJ(wireless_essid, &update_net_stats) obj->data.opaque =
|
||||
get_net_stat(arg, obj, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_essid;
|
||||
END OBJ(wireless_channel, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_channel;
|
||||
END OBJ(wireless_freq, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_frequency;
|
||||
END OBJ(wireless_mode, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_mode;
|
||||
END OBJ(wireless_bitrate, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_bitrate;
|
||||
END OBJ(wireless_ap, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_ap;
|
||||
END OBJ(wireless_link_qual, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual;
|
||||
END OBJ(wireless_link_qual_max, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual_max;
|
||||
END OBJ(wireless_link_qual_perc, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual_perc;
|
||||
END OBJ(wireless_link_bar, &update_net_stats)
|
||||
parse_net_stat_bar_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.barval = &wireless_link_barval;
|
||||
#endif /* BUILD_WLAN */
|
||||
|
||||
|
||||
#endif /* __linux__ */
|
||||
|
||||
#ifdef BUILD_WLAN
|
||||
END OBJ(wireless_essid, &update_net_stats) obj->data.opaque =
|
||||
get_net_stat(arg, obj, free_at_crash);
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_essid;
|
||||
END OBJ(wireless_channel, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_channel;
|
||||
END OBJ(wireless_freq, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_frequency;
|
||||
END OBJ(wireless_mode, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_mode;
|
||||
END OBJ(wireless_bitrate, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_bitrate;
|
||||
END OBJ(wireless_ap, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_ap;
|
||||
END OBJ(wireless_link_qual, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual;
|
||||
END OBJ(wireless_link_qual_max, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual_max;
|
||||
END OBJ(wireless_link_qual_perc, &update_net_stats)
|
||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.print = &print_wireless_link_qual_perc;
|
||||
END OBJ(wireless_link_bar, &update_net_stats)
|
||||
parse_net_stat_bar_arg(obj, arg, free_at_crash);
|
||||
obj->callbacks.barval = &wireless_link_barval;
|
||||
#endif /* BUILD_WLAN */
|
||||
|
||||
#ifndef __OpenBSD__
|
||||
END OBJ(acpifan, nullptr) obj->callbacks.print = &print_acpifan;
|
||||
END OBJ(battery, nullptr) char bat[64];
|
||||
@ -673,18 +674,21 @@ struct text_object *construct_text_object(char *s, const char *arg, long line,
|
||||
END OBJ(cpu, &update_cpu_usage) get_cpu_count();
|
||||
SCAN_CPU(arg, obj->data.i);
|
||||
obj->callbacks.percentage = &cpu_percentage;
|
||||
obj->callbacks.free = &free_cpu;
|
||||
DBGP2("Adding $cpu for CPU %d", obj->data.i);
|
||||
#ifdef BUILD_X11
|
||||
END OBJ(cpugauge, &update_cpu_usage) get_cpu_count();
|
||||
SCAN_CPU(arg, obj->data.i);
|
||||
scan_gauge(obj, arg, 1);
|
||||
obj->callbacks.gaugeval = &cpu_barval;
|
||||
obj->callbacks.free = &free_cpu;
|
||||
DBGP2("Adding $cpugauge for CPU %d", obj->data.i);
|
||||
#endif
|
||||
END OBJ(cpubar, &update_cpu_usage) get_cpu_count();
|
||||
SCAN_CPU(arg, obj->data.i);
|
||||
scan_bar(obj, arg, 1);
|
||||
obj->callbacks.barval = &cpu_barval;
|
||||
obj->callbacks.free = &free_cpu;
|
||||
DBGP2("Adding $cpubar for CPU %d", obj->data.i);
|
||||
#ifdef BUILD_X11
|
||||
END OBJ(cpugraph, &update_cpu_usage) get_cpu_count();
|
||||
@ -694,6 +698,7 @@ struct text_object *construct_text_object(char *s, const char *arg, long line,
|
||||
DBGP2("Adding $cpugraph for CPU %d", obj->data.i);
|
||||
free_and_zero(buf);
|
||||
obj->callbacks.graphval = &cpu_barval;
|
||||
obj->callbacks.free = &free_cpu;
|
||||
END OBJ(loadgraph, &update_load_average) scan_loadgraph_arg(obj, arg);
|
||||
obj->callbacks.graphval = &loadgraphval;
|
||||
#endif /* BUILD_X11 */
|
||||
|
@ -56,4 +56,6 @@ int get_entropy_poolsize(const unsigned int *);
|
||||
int get_sip_status(void);
|
||||
void print_sip_status(struct text_object *obj, char *p, int p_max_size);
|
||||
|
||||
void deallocate_cpu_sample(struct text_object *obj);
|
||||
|
||||
#endif /*DARWIN_H*/
|
||||
|
@ -42,12 +42,6 @@
|
||||
*is available. patched the _csr_check function to return the bool bit instead.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Apologies for the code style...
|
||||
* In my eyes it feels better to have
|
||||
* different styles at some specific places... :)
|
||||
*/
|
||||
|
||||
#include "conky.h" // for struct info
|
||||
#include "darwin.h"
|
||||
|
||||
@ -74,6 +68,16 @@
|
||||
|
||||
#include "darwin_sip.h" // sip status
|
||||
|
||||
#include <vector>
|
||||
|
||||
#ifdef BUILD_IPGFREQ
|
||||
#include <IntelPowerGadget/EnergyLib.h>
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_WLAN
|
||||
#import <CoreWLAN/CoreWLAN.h>
|
||||
#endif
|
||||
|
||||
/* clock_gettime includes */
|
||||
#ifndef HAVE_CLOCK_GETTIME
|
||||
#include <errno.h>
|
||||
@ -106,6 +110,10 @@ void eprintf(const char *fmt, ...) {
|
||||
*/
|
||||
static conky::simple_config_setting<bool> top_cpu_separate("top_cpu_separate",
|
||||
false, true);
|
||||
/*
|
||||
* used by update_cpu_usage()
|
||||
*/
|
||||
struct cpusample *sample_handle = nullptr;
|
||||
|
||||
static int getsysctl(const char *name, void *ptr, size_t len) {
|
||||
size_t nlen = len;
|
||||
@ -219,13 +227,12 @@ typedef struct memorysample {
|
||||
* Gets systemTime, userTime and idleTime for CPU
|
||||
* MenuMeters has been great inspiration for this function
|
||||
*/
|
||||
static void get_cpu_sample(struct cpusample *sample) {
|
||||
static void get_cpu_sample(struct cpusample **sample) {
|
||||
host_name_port_t machHost;
|
||||
natural_t processorCount;
|
||||
processor_cpu_load_info_t processorTickInfo;
|
||||
mach_msg_type_number_t processorInfoCount;
|
||||
struct cpusample *samples = nullptr;
|
||||
|
||||
|
||||
machHost = mach_host_self();
|
||||
|
||||
kern_return_t err = host_processor_info(
|
||||
@ -237,22 +244,15 @@ static void get_cpu_sample(struct cpusample *sample) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* allocate ncpus+1 cpusample structs (one foreach CPU)
|
||||
* ** samples[0] is overal CPU usage
|
||||
*/
|
||||
samples = new struct cpusample[processorCount + 1];
|
||||
memset(samples, 0, sizeof(cpusample) * (processorCount + 1));
|
||||
|
||||
/*
|
||||
* start from samples[1] because samples[0] is overall CPU usage
|
||||
*/
|
||||
for (natural_t i = 1; i < processorCount + 1; i++) {
|
||||
samples[i].totalSystemTime =
|
||||
(*sample)[i].totalSystemTime =
|
||||
processorTickInfo[i - 1].cpu_ticks[CPU_STATE_SYSTEM],
|
||||
samples[i].totalUserTime =
|
||||
(*sample)[i].totalUserTime =
|
||||
processorTickInfo[i - 1].cpu_ticks[CPU_STATE_USER],
|
||||
samples[i].totalIdleTime =
|
||||
(*sample)[i].totalIdleTime =
|
||||
processorTickInfo[i - 1].cpu_ticks[CPU_STATE_IDLE];
|
||||
}
|
||||
|
||||
@ -260,24 +260,37 @@ static void get_cpu_sample(struct cpusample *sample) {
|
||||
* sum up all totals
|
||||
*/
|
||||
for (natural_t i = 1; i < processorCount + 1; i++) {
|
||||
samples[0].totalSystemTime += samples[i].totalSystemTime;
|
||||
samples[0].totalUserTime += samples[i].totalUserTime;
|
||||
samples[0].totalIdleTime += samples[i].totalIdleTime;
|
||||
(*sample)[0].totalSystemTime += (*sample)[i].totalSystemTime;
|
||||
(*sample)[0].totalUserTime += (*sample)[i].totalUserTime;
|
||||
(*sample)[0].totalIdleTime += (*sample)[i].totalIdleTime;
|
||||
}
|
||||
|
||||
/*
|
||||
* set the sample pointer
|
||||
*/
|
||||
sample->totalSystemTime = samples[0].totalSystemTime;
|
||||
sample->totalUserTime = samples[0].totalUserTime;
|
||||
sample->totalIdleTime = samples[0].totalIdleTime;
|
||||
|
||||
/*
|
||||
* Dealloc
|
||||
*/
|
||||
vm_deallocate(mach_task_self(), (vm_address_t)processorTickInfo,
|
||||
static_cast<vm_size_t>(processorInfoCount * sizeof(natural_t)));
|
||||
delete[] samples;
|
||||
}
|
||||
|
||||
void allocate_cpu_sample(struct cpusample **sample) {
|
||||
if (*sample != nullptr)
|
||||
return;
|
||||
|
||||
/*
|
||||
* allocate ncpus+1 cpusample structs (one foreach CPU)
|
||||
* ** sample_handle[0] is overal CPU usage
|
||||
*/
|
||||
*sample = reinterpret_cast<struct cpusample *>(malloc(sizeof(cpusample) * (info.cpu_count + 1)));
|
||||
memset(*sample, 0, sizeof(cpusample) * (info.cpu_count + 1));
|
||||
|
||||
sample_handle = *sample; /* use a public handle for deallocating */
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) {
|
||||
if (sample_handle != nullptr) {
|
||||
free(sample_handle);
|
||||
sample_handle = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -567,11 +580,9 @@ uint64_t get_physical_memory() {
|
||||
}
|
||||
|
||||
int update_meminfo() {
|
||||
/* XXX implement remaining memory-related variables (see conky.h) */
|
||||
/* XXX conky breaks the values ... :( probably some rounding problem...
|
||||
Though we get the right values (based on top) */
|
||||
/* XXX probably investigate the "probably apple keeps some info secret" */
|
||||
|
||||
|
||||
/* XXX See #34 */
|
||||
|
||||
vm_size_t page_size = getpagesize(); // get pagesize in bytes
|
||||
unsigned long swap_avail, swap_free;
|
||||
|
||||
@ -638,6 +649,14 @@ int update_meminfo() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef BUILD_WLAN
|
||||
|
||||
void update_wlan_stats(struct net_stat *ns) {
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int update_net_stats() {
|
||||
struct net_stat *ns;
|
||||
double delta;
|
||||
@ -657,6 +676,10 @@ int update_net_stats() {
|
||||
if ((ifa->ifa_flags & IFF_UP) != 0u) {
|
||||
struct ifaddrs *iftmp;
|
||||
|
||||
#ifdef BUILD_WLAN
|
||||
update_wlan_stats(ns);
|
||||
#endif
|
||||
|
||||
ns->up = 1;
|
||||
last_recv = ns->recv;
|
||||
last_trans = ns->trans;
|
||||
@ -843,8 +866,6 @@ void get_cpu_count() {
|
||||
info.cpu_count = 0;
|
||||
}
|
||||
|
||||
/* XXX this can be moved to update_cpu_usage() but keep here to follow linux
|
||||
* implementation */
|
||||
if (info.cpu_usage == nullptr) {
|
||||
/*
|
||||
* Allocate ncpus+1 slots because cpu_usage[0] is overall usage.
|
||||
@ -864,16 +885,14 @@ struct cpu_info {
|
||||
};
|
||||
|
||||
int update_cpu_usage() {
|
||||
/* XXX add support for multiple cpus (see linux.cc) */
|
||||
|
||||
static bool cpu_setup = 0;
|
||||
|
||||
long used, total;
|
||||
static struct cpu_info *cpu = nullptr;
|
||||
unsigned int malloc_cpu_size = 0;
|
||||
extern void *global_cpu;
|
||||
|
||||
struct cpusample sample {};
|
||||
|
||||
static struct cpusample *sample = nullptr;
|
||||
|
||||
static pthread_mutex_t last_stat_update_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static double last_stat_update = 0.0;
|
||||
@ -905,20 +924,30 @@ int update_cpu_usage() {
|
||||
global_cpu = cpu;
|
||||
}
|
||||
|
||||
allocate_cpu_sample(&sample);
|
||||
|
||||
get_cpu_sample(&sample);
|
||||
total = sample.totalUserTime + sample.totalIdleTime + sample.totalSystemTime;
|
||||
used = total - sample.totalIdleTime;
|
||||
|
||||
if ((total - cpu[0].oldtotal) != 0) {
|
||||
info.cpu_usage[0] = (static_cast<double>(used - cpu[0].oldused)) /
|
||||
static_cast<double>(total - cpu[0].oldtotal);
|
||||
} else {
|
||||
info.cpu_usage[0] = 0;
|
||||
/*
|
||||
* Setup conky's structs for-each core
|
||||
*/
|
||||
for (int i = 1; i < info.cpu_count + 1; i++) {
|
||||
int j = i - 1;
|
||||
|
||||
total = sample[i].totalUserTime + sample[i].totalIdleTime + sample[i].totalSystemTime;
|
||||
used = total - sample[i].totalIdleTime;
|
||||
|
||||
if ((total - cpu[j].oldtotal) != 0) {
|
||||
info.cpu_usage[j] = (static_cast<double>(used - cpu[j].oldused)) /
|
||||
static_cast<double>(total - cpu[j].oldtotal);
|
||||
} else {
|
||||
info.cpu_usage[j] = 0;
|
||||
}
|
||||
|
||||
cpu[j].oldused = used;
|
||||
cpu[j].oldtotal = total;
|
||||
}
|
||||
|
||||
cpu[0].oldused = used;
|
||||
cpu[0].oldtotal = total;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -974,50 +1003,62 @@ void get_acpi_fan(char * /*p_client_buffer*/, size_t /*client_buffer_size*/) {
|
||||
|
||||
/* void */
|
||||
char get_freq(char *p_client_buffer, size_t client_buffer_size,
|
||||
const char *p_format, int divisor, unsigned int /*cpu*/) {
|
||||
/*
|
||||
* For now, we get the factory cpu frequency, not **current** cpu frequency
|
||||
* (Also, it is always the same for every core, so ignore |cpu| argument)
|
||||
*/
|
||||
|
||||
// XXX Probably find a way to get **current** cpu frequency
|
||||
|
||||
int mib[2];
|
||||
unsigned int freq;
|
||||
size_t len;
|
||||
|
||||
const char *p_format, int divisor, unsigned int cpu) {
|
||||
|
||||
if ((p_client_buffer == nullptr) || client_buffer_size <= 0 ||
|
||||
(p_format == nullptr) || divisor <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef BUILD_IPGFREQ
|
||||
/*
|
||||
* Our data is always the same for every core, so ignore |cpu| argument.
|
||||
*/
|
||||
|
||||
static bool initialised = false;
|
||||
|
||||
if (!initialised) {
|
||||
IntelEnergyLibInitialize();
|
||||
initialised = true;
|
||||
}
|
||||
|
||||
int freq = 0;
|
||||
GetIAFrequency(cpu, &freq);
|
||||
|
||||
snprintf(p_client_buffer, client_buffer_size, p_format,
|
||||
static_cast<float>(freq) / divisor);
|
||||
#else
|
||||
/*
|
||||
* We get the factory cpu frequency, not **current** cpu frequency
|
||||
* (Also, it is always the same for every core, so ignore |cpu| argument)
|
||||
* Enable BUILD_IPGFREQ for getting current frequency.
|
||||
*/
|
||||
|
||||
int mib[2];
|
||||
unsigned int freq;
|
||||
size_t len;
|
||||
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = HW_CPU_FREQ;
|
||||
len = sizeof(freq);
|
||||
|
||||
|
||||
if (sysctl(mib, 2, &freq, &len, nullptr, 0) == 0) {
|
||||
/*
|
||||
* convert to MHz
|
||||
*/
|
||||
divisor *= 1000000;
|
||||
|
||||
|
||||
snprintf(p_client_buffer, client_buffer_size, p_format,
|
||||
static_cast<float>(freq) / divisor);
|
||||
} else {
|
||||
snprintf(p_client_buffer, client_buffer_size, p_format, 0.0f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void update_wifi_stats(void)
|
||||
{
|
||||
printf("update_wifi_stats: STUB but also in #if 0\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
int update_diskio() {
|
||||
printf("update_diskio: STUB\n");
|
||||
return 0;
|
||||
@ -1058,11 +1099,13 @@ static void calc_cpu_usage_for_proc(struct process *proc, uint64_t total) {
|
||||
*/
|
||||
static void calc_cpu_total(struct process *proc, uint64_t *total) {
|
||||
uint64_t current_total = 0; /* of current iteration */
|
||||
struct cpusample sample {};
|
||||
|
||||
struct cpusample *sample = nullptr;
|
||||
|
||||
allocate_cpu_sample(&sample);
|
||||
|
||||
get_cpu_sample(&sample);
|
||||
current_total =
|
||||
sample.totalUserTime + sample.totalIdleTime + sample.totalSystemTime;
|
||||
sample[0].totalUserTime + sample[0].totalIdleTime + sample[0].totalSystemTime;
|
||||
|
||||
*total = current_total - proc->previous_total_cpu_time;
|
||||
proc->previous_total_cpu_time = current_total;
|
||||
@ -1175,17 +1218,7 @@ void get_top_info() {
|
||||
struct kinfo_proc *p = nullptr;
|
||||
|
||||
/*
|
||||
* QUICKFIX for #16
|
||||
* XXX if we run conky -t '${top_mem mem 1}' it will crash because
|
||||
* info.cpu_count is not initialised.
|
||||
*
|
||||
* We can initialise it down here, but it seems like in the linux
|
||||
* implementation of get_top_info() there is no call to the get_cpu_count()
|
||||
* function. Neither is there in core.cc... If this is the case, when is
|
||||
* info.cpu_count initialised???
|
||||
*
|
||||
* Find a proper better place for get_cpu_count() call. (for comformance with
|
||||
* linux.cc)
|
||||
* See #16
|
||||
*/
|
||||
get_cpu_count();
|
||||
|
@ -126,9 +126,7 @@ int check_mount(char *s) {
|
||||
|
||||
mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
|
||||
for (i = mntsize - 1; i >= 0; i--) {
|
||||
if (strcmp(mntbuf[i].f_mntonname, s) == 0) {
|
||||
return 1;
|
||||
}
|
||||
if (strcmp(mntbuf[i].f_mntonname, s) == 0) { return 1; }
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -178,13 +176,9 @@ int update_net_stats(void) {
|
||||
|
||||
/* get delta */
|
||||
delta = current_update_time - last_update_time;
|
||||
if (delta <= 0.0001) {
|
||||
return 0;
|
||||
}
|
||||
if (delta <= 0.0001) { return 0; }
|
||||
|
||||
if (getifaddrs(&ifap) < 0) {
|
||||
return 0;
|
||||
}
|
||||
if (getifaddrs(&ifap) < 0) { return 0; }
|
||||
|
||||
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||
ns = get_net_stat((const char *)ifa->ifa_name, nullptr, NULL);
|
||||
@ -196,9 +190,7 @@ int update_net_stats(void) {
|
||||
last_recv = ns->recv;
|
||||
last_trans = ns->trans;
|
||||
|
||||
if (ifa->ifa_addr->sa_family != AF_LINK) {
|
||||
continue;
|
||||
}
|
||||
if (ifa->ifa_addr->sa_family != AF_LINK) { continue; }
|
||||
|
||||
for (iftmp = ifa->ifa_next;
|
||||
iftmp != nullptr && strcmp(ifa->ifa_name, iftmp->ifa_name) == 0;
|
||||
@ -286,9 +278,7 @@ void get_cpu_count(void) {
|
||||
}
|
||||
|
||||
info.cpu_usage = (float *)malloc((info.cpu_count + 1) * sizeof(float));
|
||||
if (info.cpu_usage == nullptr) {
|
||||
CRIT_ERR(nullptr, NULL, "malloc");
|
||||
}
|
||||
if (info.cpu_usage == nullptr) { CRIT_ERR(nullptr, NULL, "malloc"); }
|
||||
}
|
||||
|
||||
struct cpu_info {
|
||||
@ -357,6 +347,8 @@ int update_cpu_usage(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
int update_load_average(void) {
|
||||
double v[3];
|
||||
|
||||
@ -489,9 +481,7 @@ void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size,
|
||||
|
||||
(void)adapter; // only linux uses this
|
||||
|
||||
if (!p_client_buffer || client_buffer_size <= 0) {
|
||||
return;
|
||||
}
|
||||
if (!p_client_buffer || client_buffer_size <= 0) { return; }
|
||||
|
||||
if (GETSYSCTL("hw.acpi.acline", state)) {
|
||||
fprintf(stderr, "Cannot read sysctl \"hw.acpi.acline\"\n");
|
||||
@ -711,9 +701,7 @@ void get_top_info(void) {
|
||||
#define APM_UNKNOWN 255
|
||||
|
||||
int apm_getinfo(int fd, apm_info_t aip) {
|
||||
if (ioctl(fd, APMIO_GETINFO, aip) == -1) {
|
||||
return -1;
|
||||
}
|
||||
if (ioctl(fd, APMIO_GETINFO, aip) == -1) { return -1; }
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -371,6 +371,8 @@ int update_cpu_usage(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
int update_load_average(void) {
|
||||
double v[3];
|
||||
|
||||
@ -641,9 +643,7 @@ int update_diskio(void) {
|
||||
free(dev_select);
|
||||
}
|
||||
|
||||
if (statinfo_cur.dinfo->mem_ptr) {
|
||||
free(statinfo_cur.dinfo->mem_ptr);
|
||||
}
|
||||
if (statinfo_cur.dinfo->mem_ptr) { free(statinfo_cur.dinfo->mem_ptr); }
|
||||
free(statinfo_cur.dinfo);
|
||||
return 0;
|
||||
}
|
||||
|
@ -143,6 +143,8 @@ int update_cpu_usage() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
int update_load_average() {
|
||||
// TODO
|
||||
return 1;
|
||||
|
@ -936,6 +936,8 @@ int update_cpu_usage(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
// fscanf() that reads floats with points even if you are using a locale where
|
||||
// floats are with commas
|
||||
int fscanf_no_i18n(FILE *stream, const char *format, ...) {
|
||||
|
@ -476,7 +476,11 @@ int interface_up(struct text_object *obj) {
|
||||
|
||||
if (dev == nullptr) { return 0; }
|
||||
|
||||
#if defined(__APPLE__) && defined(__MACH__)
|
||||
if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
|
||||
#else
|
||||
if ((fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0)) < 0) {
|
||||
#endif
|
||||
CRIT_ERR(nullptr, nullptr, "could not create sockfd");
|
||||
return 0;
|
||||
}
|
||||
|
@ -286,6 +286,8 @@ void update_cpu_usage() {
|
||||
oldtotal = total;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
void update_load_average() {
|
||||
double v[3];
|
||||
|
||||
|
@ -400,6 +400,9 @@ void update_cpu_usage() {
|
||||
#endif
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */
|
||||
}
|
||||
|
||||
void update_load_average() {
|
||||
double v[3];
|
||||
|
||||
|
@ -314,6 +314,8 @@ int update_cpu_usage(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_cpu(struct text_object *) { /* no-op */ }
|
||||
|
||||
void update_proc_entry(struct process *p) {
|
||||
psinfo_t proc;
|
||||
int fd;
|
||||
|
Loading…
Reference in New Issue
Block a user