mirror of https://github.com/xzeldon/htop.git
Merge branch 'temperature_v2' of cgzones/htop
Closes #111, closes #49 Closes #93 - thank you for leading the way @DX37 (Maxim Kurnosenko)!
This commit is contained in:
commit
fec9af4e6f
|
@ -12,11 +12,11 @@ jobs:
|
||||||
- name: Bootstrap
|
- name: Bootstrap
|
||||||
run: ./autogen.sh
|
run: ./autogen.sh
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: ./configure --enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode
|
run: ./configure --enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode --disable-sensors
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -k
|
run: make -k
|
||||||
- name: Distcheck
|
- name: Distcheck
|
||||||
run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode"
|
run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode --disable-sensors"
|
||||||
|
|
||||||
build-ubuntu-latest-minimal-clang:
|
build-ubuntu-latest-minimal-clang:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -34,26 +34,26 @@ jobs:
|
||||||
- name: Bootstrap
|
- name: Bootstrap
|
||||||
run: ./autogen.sh
|
run: ./autogen.sh
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: ./configure --enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode
|
run: ./configure --enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode --disable-sensors
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -k
|
run: make -k
|
||||||
- name: Distcheck
|
- name: Distcheck
|
||||||
run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode"
|
run: make distcheck DISTCHECK_CONFIGURE_FLAGS="--enable-werror --enable-linux-affinity --disable-taskstats --disable-unicode --disable-sensors"
|
||||||
|
|
||||||
build-ubuntu-latest-full-featured-gcc:
|
build-ubuntu-latest-full-featured-gcc:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: sudo apt-get install libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev
|
run: sudo apt-get install libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev
|
||||||
- name: Bootstrap
|
- name: Bootstrap
|
||||||
run: ./autogen.sh
|
run: ./autogen.sh
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: ./configure --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct
|
run: ./configure --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct --enable-sensors
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -k
|
run: make -k
|
||||||
- name: Distcheck
|
- name: Distcheck
|
||||||
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct'
|
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct --enable-sensors'
|
||||||
|
|
||||||
build-ubuntu-latest-full-featured-clang:
|
build-ubuntu-latest-full-featured-clang:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -67,15 +67,15 @@ jobs:
|
||||||
sudo add-apt-repository 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main' -y
|
sudo add-apt-repository 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main' -y
|
||||||
sudo apt-get update -q
|
sudo apt-get update -q
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: sudo apt-get install clang-10 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev
|
run: sudo apt-get install clang-10 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev
|
||||||
- name: Bootstrap
|
- name: Bootstrap
|
||||||
run: ./autogen.sh
|
run: ./autogen.sh
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: ./configure --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct
|
run: ./configure --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct --enable-sensors
|
||||||
- name: Build
|
- name: Build
|
||||||
run: make -k
|
run: make -k
|
||||||
- name: Distcheck
|
- name: Distcheck
|
||||||
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct'
|
run: make distcheck DISTCHECK_CONFIGURE_FLAGS='--enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct --enable-sensors'
|
||||||
|
|
||||||
build-ubuntu-latest-clang-analyzer:
|
build-ubuntu-latest-clang-analyzer:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -89,11 +89,11 @@ jobs:
|
||||||
sudo add-apt-repository 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main' -y
|
sudo add-apt-repository 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-11 main' -y
|
||||||
sudo apt-get update -q
|
sudo apt-get update -q
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: sudo apt-get install clang-11 clang-tools-11 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev
|
run: sudo apt-get install clang-11 clang-tools-11 libncursesw5-dev libhwloc-dev libnl-3-dev libnl-genl-3-dev libsensors4-dev
|
||||||
- name: Bootstrap
|
- name: Bootstrap
|
||||||
run: ./autogen.sh
|
run: ./autogen.sh
|
||||||
- name: Configure
|
- name: Configure
|
||||||
run: scan-build-11 -analyze-headers --status-bugs ./configure --enable-debug --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct
|
run: scan-build-11 -analyze-headers --status-bugs ./configure --enable-debug --enable-werror --enable-openvz --enable-cgroup --enable-vserver --enable-ancient-vserver --enable-taskstats --enable-unicode --enable-hwloc --enable-setuid --enable-delayacct --enable-sensors
|
||||||
- name: Build
|
- name: Build
|
||||||
run: scan-build-11 -analyze-headers --status-bugs make -j"$(nproc)"
|
run: scan-build-11 -analyze-headers --status-bugs make -j"$(nproc)"
|
||||||
|
|
||||||
|
|
53
CPUMeter.c
53
CPUMeter.c
|
@ -56,25 +56,44 @@ static void CPUMeter_updateValues(Meter* this, char* buffer, int size) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memset(this->values, 0, sizeof(double) * CPU_METER_ITEMCOUNT);
|
memset(this->values, 0, sizeof(double) * CPU_METER_ITEMCOUNT);
|
||||||
|
|
||||||
|
char cpuUsageBuffer[8] = { 0 };
|
||||||
|
char cpuFrequencyBuffer[16] = { 0 };
|
||||||
|
char cpuTemperatureBuffer[16] = { 0 };
|
||||||
|
|
||||||
double percent = Platform_setCPUValues(this, cpu);
|
double percent = Platform_setCPUValues(this, cpu);
|
||||||
|
|
||||||
|
if (this->pl->settings->showCPUUsage) {
|
||||||
|
xSnprintf(cpuUsageBuffer, sizeof(cpuUsageBuffer), "%5.1f%%", percent);
|
||||||
|
}
|
||||||
|
|
||||||
if (this->pl->settings->showCPUFrequency) {
|
if (this->pl->settings->showCPUFrequency) {
|
||||||
double cpuFrequency = this->values[CPU_METER_FREQUENCY];
|
double cpuFrequency = this->values[CPU_METER_FREQUENCY];
|
||||||
char cpuFrequencyBuffer[16];
|
|
||||||
if (isnan(cpuFrequency)) {
|
if (isnan(cpuFrequency)) {
|
||||||
xSnprintf(cpuFrequencyBuffer, sizeof(cpuFrequencyBuffer), "N/A");
|
xSnprintf(cpuFrequencyBuffer, sizeof(cpuFrequencyBuffer), "N/A");
|
||||||
} else {
|
} else {
|
||||||
xSnprintf(cpuFrequencyBuffer, sizeof(cpuFrequencyBuffer), "%4uMHz", (unsigned)cpuFrequency);
|
xSnprintf(cpuFrequencyBuffer, sizeof(cpuFrequencyBuffer), "%4uMHz", (unsigned)cpuFrequency);
|
||||||
}
|
}
|
||||||
if (this->pl->settings->showCPUUsage) {
|
|
||||||
xSnprintf(buffer, size, "%5.1f%% %s", percent, cpuFrequencyBuffer);
|
|
||||||
} else {
|
|
||||||
xSnprintf(buffer, size, "%s", cpuFrequencyBuffer);
|
|
||||||
}
|
}
|
||||||
} else if (this->pl->settings->showCPUUsage) {
|
|
||||||
xSnprintf(buffer, size, "%5.1f%%", percent);
|
#ifdef HAVE_LIBSENSORS
|
||||||
} else if (size > 0) {
|
if (this->pl->settings->showCPUTemperature) {
|
||||||
buffer[0] = '\0';
|
double cpuTemperature = this->values[CPU_METER_TEMPERATURE];
|
||||||
|
if (isnan(cpuTemperature))
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "N/A");
|
||||||
|
else if (this->pl->settings->degreeFahrenheit)
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%3d%sF", (int)(cpuTemperature * 9 / 5 + 32), CRT_degreeSign);
|
||||||
|
else
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%d%sC", (int)cpuTemperature, CRT_degreeSign);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
xSnprintf(buffer, size, "%s%s%s%s%s",
|
||||||
|
cpuUsageBuffer,
|
||||||
|
(cpuUsageBuffer[0] && (cpuFrequencyBuffer[0] || cpuTemperatureBuffer[0])) ? " " : "",
|
||||||
|
cpuFrequencyBuffer,
|
||||||
|
(cpuFrequencyBuffer[0] && cpuTemperatureBuffer[0]) ? " " : "",
|
||||||
|
cpuTemperatureBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CPUMeter_display(const Object* cast, RichString* out) {
|
static void CPUMeter_display(const Object* cast, RichString* out) {
|
||||||
|
@ -127,6 +146,22 @@ static void CPUMeter_display(const Object* cast, RichString* out) {
|
||||||
RichString_append(out, CRT_colors[CPU_GUEST], buffer);
|
RichString_append(out, CRT_colors[CPU_GUEST], buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
if (this->pl->settings->showCPUTemperature) {
|
||||||
|
char cpuTemperatureBuffer[10];
|
||||||
|
double cpuTemperature = this->values[CPU_METER_TEMPERATURE];
|
||||||
|
if (isnan(cpuTemperature)) {
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "N/A");
|
||||||
|
} else if (this->pl->settings->degreeFahrenheit) {
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sF", cpuTemperature * 9 / 5 + 32, CRT_degreeSign);
|
||||||
|
} else {
|
||||||
|
xSnprintf(cpuTemperatureBuffer, sizeof(cpuTemperatureBuffer), "%5.1f%sC", cpuTemperature, CRT_degreeSign);
|
||||||
|
}
|
||||||
|
RichString_append(out, CRT_colors[METER_TEXT], "temp:");
|
||||||
|
RichString_append(out, CRT_colors[METER_VALUE], cpuTemperatureBuffer);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) {
|
static void AllCPUsMeter_getRange(Meter* this, int* start, int* count) {
|
||||||
|
|
|
@ -19,7 +19,8 @@ typedef enum {
|
||||||
CPU_METER_GUEST = 6,
|
CPU_METER_GUEST = 6,
|
||||||
CPU_METER_IOWAIT = 7,
|
CPU_METER_IOWAIT = 7,
|
||||||
CPU_METER_FREQUENCY = 8,
|
CPU_METER_FREQUENCY = 8,
|
||||||
CPU_METER_ITEMCOUNT = 9, // number of entries in this enum
|
CPU_METER_TEMPERATURE = 9,
|
||||||
|
CPU_METER_ITEMCOUNT = 10, // number of entries in this enum
|
||||||
} CPUMeterValues;
|
} CPUMeterValues;
|
||||||
|
|
||||||
extern const MeterClass CPUMeter_class;
|
extern const MeterClass CPUMeter_class;
|
||||||
|
|
19
CRT.c
19
CRT.c
|
@ -74,6 +74,23 @@ const char* const* CRT_treeStr = CRT_treeStrAscii;
|
||||||
|
|
||||||
int CRT_delay;
|
int CRT_delay;
|
||||||
|
|
||||||
|
const char* CRT_degreeSign;
|
||||||
|
|
||||||
|
static const char* initDegreeSign(void) {
|
||||||
|
#ifdef HAVE_LIBNCURSESW
|
||||||
|
if (CRT_utf8)
|
||||||
|
return "\xc2\xb0";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static char buffer[4];
|
||||||
|
// this might fail if the current locale does not support wide characters
|
||||||
|
int r = snprintf(buffer, sizeof(buffer), "%lc", 176);
|
||||||
|
if (r > 0)
|
||||||
|
return buffer;
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
const int* CRT_colors;
|
const int* CRT_colors;
|
||||||
|
|
||||||
int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
|
@ -718,6 +735,8 @@ void CRT_init(int delay, int colorScheme, bool allowUnicode) {
|
||||||
if (CRT_pageSize == -1)
|
if (CRT_pageSize == -1)
|
||||||
CRT_fatalError("Fatal error: Can not get PAGE_SIZE by sysconf(_SC_PAGESIZE)");
|
CRT_fatalError("Fatal error: Can not get PAGE_SIZE by sysconf(_SC_PAGESIZE)");
|
||||||
CRT_pageSizeKB = CRT_pageSize / 1024;
|
CRT_pageSizeKB = CRT_pageSize / 1024;
|
||||||
|
|
||||||
|
CRT_degreeSign = initDegreeSign();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRT_done() {
|
void CRT_done() {
|
||||||
|
|
1
CRT.h
1
CRT.h
|
@ -129,6 +129,7 @@ void CRT_handleSIGSEGV(int signal) ATTR_NORETURN;
|
||||||
#define KEY_RECLICK KEY_F(22)
|
#define KEY_RECLICK KEY_F(22)
|
||||||
#define KEY_ALT(x) (KEY_F(64 - 26) + ((x) - 'A'))
|
#define KEY_ALT(x) (KEY_F(64 - 26) + ((x) - 'A'))
|
||||||
|
|
||||||
|
extern const char* CRT_degreeSign;
|
||||||
|
|
||||||
#ifdef HAVE_LIBNCURSESW
|
#ifdef HAVE_LIBNCURSESW
|
||||||
|
|
||||||
|
|
|
@ -92,6 +92,10 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager*
|
||||||
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Add guest time in CPU meter percentage"), &(settings->accountGuestInCPUMeter)));
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Add guest time in CPU meter percentage"), &(settings->accountGuestInCPUMeter)));
|
||||||
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU percentage numerically"), &(settings->showCPUUsage)));
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU percentage numerically"), &(settings->showCPUUsage)));
|
||||||
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU frequency"), &(settings->showCPUFrequency)));
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU frequency"), &(settings->showCPUFrequency)));
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Also show CPU temperature"), &(settings->showCPUTemperature)));
|
||||||
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Show temperature in degree Fahrenheit"), &(settings->degreeFahrenheit)));
|
||||||
|
#endif
|
||||||
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Enable the mouse"), &(settings->enableMouse)));
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Enable the mouse"), &(settings->enableMouse)));
|
||||||
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Highlight new and old processes"), &(settings->highlightChanges)));
|
Panel_add(super, (Object*) CheckItem_newByRef(xStrdup("Highlight new and old processes"), &(settings->highlightChanges)));
|
||||||
#ifdef HAVE_LIBHWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
|
|
14
Settings.c
14
Settings.c
|
@ -177,6 +177,12 @@ static bool Settings_read(Settings* this, const char* fileName, int initialCpuCo
|
||||||
this->showCPUUsage = atoi(option[1]);
|
this->showCPUUsage = atoi(option[1]);
|
||||||
} else if (String_eq(option[0], "show_cpu_frequency")) {
|
} else if (String_eq(option[0], "show_cpu_frequency")) {
|
||||||
this->showCPUFrequency = atoi(option[1]);
|
this->showCPUFrequency = atoi(option[1]);
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
} else if (String_eq(option[0], "show_cpu_temperature")) {
|
||||||
|
this->showCPUTemperature = atoi(option[1]);
|
||||||
|
} else if (String_eq(option[0], "degree_fahrenheit")) {
|
||||||
|
this->degreeFahrenheit = atoi(option[1]);
|
||||||
|
#endif
|
||||||
} else if (String_eq(option[0], "update_process_names")) {
|
} else if (String_eq(option[0], "update_process_names")) {
|
||||||
this->updateProcessNames = atoi(option[1]);
|
this->updateProcessNames = atoi(option[1]);
|
||||||
} else if (String_eq(option[0], "account_guest_in_cpu_meter")) {
|
} else if (String_eq(option[0], "account_guest_in_cpu_meter")) {
|
||||||
|
@ -277,6 +283,10 @@ bool Settings_write(Settings* this) {
|
||||||
fprintf(fd, "cpu_count_from_one=%d\n", (int) this->countCPUsFromOne);
|
fprintf(fd, "cpu_count_from_one=%d\n", (int) this->countCPUsFromOne);
|
||||||
fprintf(fd, "show_cpu_usage=%d\n", (int) this->showCPUUsage);
|
fprintf(fd, "show_cpu_usage=%d\n", (int) this->showCPUUsage);
|
||||||
fprintf(fd, "show_cpu_frequency=%d\n", (int) this->showCPUFrequency);
|
fprintf(fd, "show_cpu_frequency=%d\n", (int) this->showCPUFrequency);
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
fprintf(fd, "show_cpu_temperature=%d\n", (int) this->showCPUTemperature);
|
||||||
|
fprintf(fd, "degree_fahrenheit=%d\n", (int) this->degreeFahrenheit);
|
||||||
|
#endif
|
||||||
fprintf(fd, "update_process_names=%d\n", (int) this->updateProcessNames);
|
fprintf(fd, "update_process_names=%d\n", (int) this->updateProcessNames);
|
||||||
fprintf(fd, "account_guest_in_cpu_meter=%d\n", (int) this->accountGuestInCPUMeter);
|
fprintf(fd, "account_guest_in_cpu_meter=%d\n", (int) this->accountGuestInCPUMeter);
|
||||||
fprintf(fd, "color_scheme=%d\n", (int) this->colorScheme);
|
fprintf(fd, "color_scheme=%d\n", (int) this->colorScheme);
|
||||||
|
@ -309,6 +319,10 @@ Settings* Settings_new(int initialCpuCount) {
|
||||||
this->countCPUsFromOne = false;
|
this->countCPUsFromOne = false;
|
||||||
this->showCPUUsage = true;
|
this->showCPUUsage = true;
|
||||||
this->showCPUFrequency = false;
|
this->showCPUFrequency = false;
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
this->showCPUTemperature = false;
|
||||||
|
this->degreeFahrenheit = false;
|
||||||
|
#endif
|
||||||
this->updateProcessNames = false;
|
this->updateProcessNames = false;
|
||||||
this->showProgramPath = true;
|
this->showProgramPath = true;
|
||||||
this->highlightThreads = true;
|
this->highlightThreads = true;
|
||||||
|
|
|
@ -38,6 +38,10 @@ typedef struct Settings_ {
|
||||||
bool detailedCPUTime;
|
bool detailedCPUTime;
|
||||||
bool showCPUUsage;
|
bool showCPUUsage;
|
||||||
bool showCPUFrequency;
|
bool showCPUFrequency;
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
bool showCPUTemperature;
|
||||||
|
bool degreeFahrenheit;
|
||||||
|
#endif
|
||||||
bool treeView;
|
bool treeView;
|
||||||
bool showProgramPath;
|
bool showProgramPath;
|
||||||
bool shadowOtherUsers;
|
bool shadowOtherUsers;
|
||||||
|
|
11
configure.ac
11
configure.ac
|
@ -308,6 +308,16 @@ then
|
||||||
])
|
])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(sensors, [AS_HELP_STRING([--enable-sensors], [enable libsensors support for reading temperature data.])],, enable_sensors="check")
|
||||||
|
if test "x$enable_sensors" = xyes; then
|
||||||
|
AC_CHECK_LIB([sensors], [sensors_get_value], [], [missing_libraries="$missing_libraries libsensors"])
|
||||||
|
AC_CHECK_HEADERS([sensors/sensors.h], [], [missing_headers="$missing_headers $ac_header"])
|
||||||
|
elif test "x$enable_sensors" = xcheck; then
|
||||||
|
enable_sensors=yes
|
||||||
|
AC_CHECK_LIB([sensors], [sensors_get_value], [], [enable_sensors=no])
|
||||||
|
AC_CHECK_HEADERS([sensors/sensors.h], [], [enable_sensors=no])
|
||||||
|
fi
|
||||||
|
|
||||||
AM_CFLAGS="\
|
AM_CFLAGS="\
|
||||||
-Wall\
|
-Wall\
|
||||||
-Wcast-align\
|
-Wcast-align\
|
||||||
|
@ -386,6 +396,7 @@ AC_MSG_RESULT([
|
||||||
(Linux) taskstats: $enable_taskstats
|
(Linux) taskstats: $enable_taskstats
|
||||||
(Linux) affinity: $enable_linux_affinity
|
(Linux) affinity: $enable_linux_affinity
|
||||||
(Linux) delay accounting: $enable_delayacct
|
(Linux) delay accounting: $enable_delayacct
|
||||||
|
(Linux) sensors: $enable_sensors
|
||||||
unicode: $enable_unicode
|
unicode: $enable_unicode
|
||||||
hwloc: $enable_hwloc
|
hwloc: $enable_hwloc
|
||||||
setuid: $enable_setuid
|
setuid: $enable_setuid
|
||||||
|
|
|
@ -224,6 +224,7 @@ double Platform_setCPUValues(Meter* mtr, int cpu) {
|
||||||
total = mtr->values[CPU_METER_NICE] + mtr->values[CPU_METER_NORMAL] + mtr->values[CPU_METER_KERNEL];
|
total = mtr->values[CPU_METER_NICE] + mtr->values[CPU_METER_NORMAL] + mtr->values[CPU_METER_KERNEL];
|
||||||
|
|
||||||
mtr->values[CPU_METER_FREQUENCY] = NAN;
|
mtr->values[CPU_METER_FREQUENCY] = NAN;
|
||||||
|
mtr->values[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return CLAMP(total, 0.0, 100.0);
|
return CLAMP(total, 0.0, 100.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,7 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
percent = isnan(percent) ? 0.0 : CLAMP(percent, 0.0, 100.0);
|
percent = isnan(percent) ? 0.0 : CLAMP(percent, 0.0, 100.0);
|
||||||
|
|
||||||
v[CPU_METER_FREQUENCY] = NAN;
|
v[CPU_METER_FREQUENCY] = NAN;
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return percent;
|
return percent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,6 +190,7 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
percent = CLAMP(percent, 0.0, 100.0);
|
percent = CLAMP(percent, 0.0, 100.0);
|
||||||
|
|
||||||
v[CPU_METER_FREQUENCY] = NAN;
|
v[CPU_METER_FREQUENCY] = NAN;
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return percent;
|
return percent;
|
||||||
}
|
}
|
||||||
|
|
12
htop.c
12
htop.c
|
@ -36,6 +36,10 @@ in the source distribution for its full text.
|
||||||
#include "XUtils.h"
|
#include "XUtils.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
#include <sensors/sensors.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
//#link m
|
//#link m
|
||||||
|
|
||||||
static void printVersionFlag(void) {
|
static void printVersionFlag(void) {
|
||||||
|
@ -317,6 +321,10 @@ int main(int argc, char** argv) {
|
||||||
|
|
||||||
CRT_init(settings->delay, settings->colorScheme, flags.allowUnicode);
|
CRT_init(settings->delay, settings->colorScheme, flags.allowUnicode);
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
sensors_init(NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
MainPanel* panel = MainPanel_new();
|
MainPanel* panel = MainPanel_new();
|
||||||
ProcessList_setPanel(pl, (Panel*) panel);
|
ProcessList_setPanel(pl, (Panel*) panel);
|
||||||
|
|
||||||
|
@ -357,6 +365,10 @@ int main(int argc, char** argv) {
|
||||||
attroff(CRT_colors[RESET_COLOR]);
|
attroff(CRT_colors[RESET_COLOR]);
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
sensors_cleanup();
|
||||||
|
#endif
|
||||||
|
|
||||||
CRT_done();
|
CRT_done();
|
||||||
if (settings->changed)
|
if (settings->changed)
|
||||||
Settings_write(settings);
|
Settings_write(settings);
|
||||||
|
|
|
@ -50,6 +50,10 @@ in the source distribution for its full text.
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
#include <sensors/sensors.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static ssize_t xread(int fd, void* buf, size_t count) {
|
static ssize_t xread(int fd, void* buf, size_t count) {
|
||||||
// Read some bytes. Retry on EINTR and when we don't get as many bytes as we requested.
|
// Read some bytes. Retry on EINTR and when we don't get as many bytes as we requested.
|
||||||
|
@ -1505,6 +1509,75 @@ static void LinuxProcessList_scanCPUFrequency(LinuxProcessList* this) {
|
||||||
scanCPUFreqencyFromCPUinfo(this);
|
scanCPUFreqencyFromCPUinfo(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
static int getCPUTemperatures(CPUData* cpus, int cpuCount) {
|
||||||
|
int tempCount = 0;
|
||||||
|
|
||||||
|
int n = 0;
|
||||||
|
for (const sensors_chip_name *chip = sensors_get_detected_chips(NULL, &n); chip; chip = sensors_get_detected_chips(NULL, &n)) {
|
||||||
|
char buffer[32];
|
||||||
|
sensors_snprintf_chip_name(buffer, sizeof(buffer), chip);
|
||||||
|
if (!String_startsWith(buffer, "coretemp") && !String_startsWith(buffer, "cpu_thermal"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int m = 0;
|
||||||
|
for (const sensors_feature *feature = sensors_get_features(chip, &m); feature; feature = sensors_get_features(chip, &m)) {
|
||||||
|
if (feature->type != SENSORS_FEATURE_TEMP)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (feature->number > cpuCount)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const sensors_subfeature *sub_feature = sensors_get_subfeature(chip, feature, SENSORS_SUBFEATURE_TEMP_INPUT);
|
||||||
|
if (sub_feature) {
|
||||||
|
double temp;
|
||||||
|
int r = sensors_get_value(chip, sub_feature->number, &temp);
|
||||||
|
if (r != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cpus[feature->number].temperature = temp;
|
||||||
|
tempCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void LinuxProcessList_scanCPUTemperature(LinuxProcessList* this) {
|
||||||
|
const int cpuCount = this->super.cpuCount;
|
||||||
|
|
||||||
|
for (int i = 0; i <= cpuCount; i++) {
|
||||||
|
this->cpus[i].temperature = NAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
int r = getCPUTemperatures(this->cpus, cpuCount);
|
||||||
|
|
||||||
|
/* No temperature - nothing to do */
|
||||||
|
if (r == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Only package temperature - copy to all cpus */
|
||||||
|
if (r == 1 && !isnan(this->cpus[0].temperature)) {
|
||||||
|
double packageTemp = this->cpus[0].temperature;
|
||||||
|
for (int i = 1; i <= cpuCount; i++) {
|
||||||
|
this->cpus[i].temperature = packageTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Half the temperatures, probably HT/SMT - copy to second half */
|
||||||
|
if (r >= 2 && (r - 1) == (cpuCount / 2)) {
|
||||||
|
for (int i = cpuCount / 2 + 1; i <= cpuCount; i++) {
|
||||||
|
this->cpus[i].temperature = this->cpus[i/2].temperature;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||||
LinuxProcessList* this = (LinuxProcessList*) super;
|
LinuxProcessList* this = (LinuxProcessList*) super;
|
||||||
const Settings* settings = super->settings;
|
const Settings* settings = super->settings;
|
||||||
|
@ -1520,6 +1593,11 @@ void ProcessList_goThroughEntries(ProcessList* super, bool pauseProcessUpdate) {
|
||||||
LinuxProcessList_scanCPUFrequency(this);
|
LinuxProcessList_scanCPUFrequency(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
if (settings->showCPUTemperature)
|
||||||
|
LinuxProcessList_scanCPUTemperature(this);
|
||||||
|
#endif
|
||||||
|
|
||||||
// in pause mode only gather global data for meters (CPU/memory/...)
|
// in pause mode only gather global data for meters (CPU/memory/...)
|
||||||
if (pauseProcessUpdate) {
|
if (pauseProcessUpdate) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -47,6 +47,10 @@ typedef struct CPUData_ {
|
||||||
unsigned long long int guestPeriod;
|
unsigned long long int guestPeriod;
|
||||||
|
|
||||||
double frequency;
|
double frequency;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
double temperature;
|
||||||
|
#endif
|
||||||
} CPUData;
|
} CPUData;
|
||||||
|
|
||||||
typedef struct TtyDriver_ {
|
typedef struct TtyDriver_ {
|
||||||
|
|
|
@ -241,6 +241,12 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
|
|
||||||
v[CPU_METER_FREQUENCY] = cpuData->frequency;
|
v[CPU_METER_FREQUENCY] = cpuData->frequency;
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBSENSORS
|
||||||
|
v[CPU_METER_TEMPERATURE] = cpuData->temperature;
|
||||||
|
#else
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
#endif
|
||||||
|
|
||||||
return percent;
|
return percent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -187,6 +187,9 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
if (isnan(totalPercent)) {
|
if (isnan(totalPercent)) {
|
||||||
totalPercent = 0.0;
|
totalPercent = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return totalPercent;
|
return totalPercent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,7 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
percent = isnan(percent) ? 0.0 : CLAMP(percent, 0.0, 100.0);
|
percent = isnan(percent) ? 0.0 : CLAMP(percent, 0.0, 100.0);
|
||||||
|
|
||||||
v[CPU_METER_FREQUENCY] = NAN;
|
v[CPU_METER_FREQUENCY] = NAN;
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return percent;
|
return percent;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,6 +119,7 @@ double Platform_setCPUValues(Meter* this, int cpu) {
|
||||||
|
|
||||||
double* v = this->values;
|
double* v = this->values;
|
||||||
v[CPU_METER_FREQUENCY] = NAN;
|
v[CPU_METER_FREQUENCY] = NAN;
|
||||||
|
v[CPU_METER_TEMPERATURE] = NAN;
|
||||||
|
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue