diff --git a/src/amdgpu.cpp b/src/amdgpu.cpp index c0c9dee..ff4e920 100644 --- a/src/amdgpu.cpp +++ b/src/amdgpu.cpp @@ -14,6 +14,9 @@ std::string metrics_path = ""; struct amdgpu_common_metrics amdgpu_common_metrics; std::mutex amdgpu_common_metrics_m; +std::mutex amdgpu_m; +std::condition_variable amdgpu_c; +bool amdgpu_run_thread = false; bool amdgpu_verify_metrics(const std::string& path) { @@ -233,6 +236,9 @@ void amdgpu_metrics_polling_thread() { memset(metrics_buffer, 0, sizeof(metrics_buffer)); while (1) { + std::unique_lock lock(amdgpu_m); + amdgpu_c.wait(lock, []{return amdgpu_run_thread;}); + lock.unlock(); #ifndef TEST_ONLY if (HUDElements.params->no_display && !logger->is_active()) usleep(100000); diff --git a/src/amdgpu.h b/src/amdgpu.h index d0addee..a41f05b 100644 --- a/src/amdgpu.h +++ b/src/amdgpu.h @@ -6,6 +6,8 @@ #include #include #include "overlay_params.h" +#include +#include // #include #define METRICS_UPDATE_PERIOD_MS 500 @@ -188,6 +190,8 @@ struct amdgpu_common_metrics { bool amdgpu_verify_metrics(const std::string& path); void amdgpu_get_metrics(); extern std::string metrics_path; +extern std::condition_variable amdgpu_c; +extern bool amdgpu_run_thread; void amdgpu_get_instant_metrics(struct amdgpu_common_metrics *metrics); void amdgpu_metrics_polling_thread(); void amdgpu_get_samples_and_copy(struct amdgpu_common_metrics metrics_buffer[METRICS_SAMPLE_COUNT], bool &gpu_load_needs_dividing); diff --git a/src/app/main.cpp b/src/app/main.cpp index a6c1d16..3922ee6 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -18,6 +18,7 @@ #include "mangoapp_proto.h" #include #include +#include "amdgpu.h" #define GLFW_EXPOSE_NATIVE_X11 #include @@ -310,6 +311,10 @@ int main(int, char**) XChangeProperty(x11_display, x11_window, overlay_atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&value, 1); XSync(x11_display, 0); mangoapp_paused = false; + { + amdgpu_run_thread = true; + amdgpu_c.notify_one(); + } } { std::unique_lock lk(mangoapp_m); @@ -349,6 +354,10 @@ int main(int, char**) XChangeProperty(x11_display, x11_window, overlay_atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&value, 1); XSync(x11_display, 0); mangoapp_paused = true; + { + amdgpu_run_thread = false; + amdgpu_c.notify_one(); + } std::unique_lock lk(mangoapp_m); mangoapp_cv.wait(lk, []{return !params.no_display;}); }