From 10e5abcccce02edccc1b4c81f447f47abd6e141c Mon Sep 17 00:00:00 2001 From: Self Denial Date: Sat, 30 Sep 2023 16:58:47 -0600 Subject: [PATCH] Attempt to query number of coolers before fan_speed. Inspiration: https://github.com/NVIDIA/nvidia-settings/blob/main/samples/nv-control-targets.c --- src/loaders/loader_nvctrl.cpp | 8 ++++++++ src/loaders/loader_nvctrl.h | 1 + src/nvctrl.cpp | 13 +++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/loaders/loader_nvctrl.cpp b/src/loaders/loader_nvctrl.cpp index 5e14a12c..4c6fb286 100644 --- a/src/loaders/loader_nvctrl.cpp +++ b/src/loaders/loader_nvctrl.cpp @@ -80,6 +80,14 @@ bool libnvctrl_loader::Load(const std::string& library_name) { return false; } + XNVCTRLQueryTargetCount = + reinterpret_castXNVCTRLQueryTargetCount)>( + dlsym(library_, "XNVCTRLQueryTargetCount")); + if (!XNVCTRLQueryTargetCount) { + CleanUp(true); + return false; + } + #endif #if defined(LIBRARY_LOADER_NVCTRL_H_DT_NEEDED) diff --git a/src/loaders/loader_nvctrl.h b/src/loaders/loader_nvctrl.h index 8ddb532a..81bc4359 100644 --- a/src/loaders/loader_nvctrl.h +++ b/src/loaders/loader_nvctrl.h @@ -24,6 +24,7 @@ class libnvctrl_loader { decltype(&::XNVCTRLQueryAttribute) XNVCTRLQueryAttribute; decltype(&::XNVCTRLQueryTargetStringAttribute) XNVCTRLQueryTargetStringAttribute; decltype(&::XNVCTRLQueryTargetAttribute64) XNVCTRLQueryTargetAttribute64; + decltype(&::XNVCTRLQueryTargetCount) XNVCTRLQueryTargetCount; private: void CleanUp(bool unload); diff --git a/src/nvctrl.cpp b/src/nvctrl.cpp index 7389b4f7..0203cf08 100644 --- a/src/nvctrl.cpp +++ b/src/nvctrl.cpp @@ -164,6 +164,19 @@ void getNvctrlInfo(){ int64_t getNvctrlFanSpeed(){ auto& nvctrl = get_libnvctrl_loader(); int64_t fan_speed = 0; + /* Get the number of Cooler devices in the system */ + int num_coolers; + bool ret = nvctrl.XNVCTRLQueryTargetCount(display.get(), + NV_CTRL_TARGET_TYPE_COOLER, + &num_coolers); + if (!ret) { + SPDLOG_ERROR("XNVCtrl Failed to query number of Coolers"); + } else { + SPDLOG_DEBUG("XNVCtrl number of Cooler Devices: {}", num_coolers); + if (num_coolers <= 0) { + return fan_speed; + } + } nvctrl.XNVCTRLQueryTargetAttribute64(display.get(), NV_CTRL_TARGET_TYPE_COOLER, 0,