mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-17 21:13:48 -07:00
* keybindmgr: avoid uint rollover on mouse keycode mouse keycode is 0, and the switch case checks for 0 - 8 and rolls over, just return early if keycode is 0. * watchdog: avoid data races in watchdog asan thread sanitizer reported data races in the watchdog from reading and setting the bool variables make them std::atomic bools. also add a atomic bool for the main thread to wait for to avoid data race when reading the config values. * hyprdebug: change non unicode character to name asan created false positives and didnt like this bit, so for the sake of easier debugging rename it to something unicode.
59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
#include "Watchdog.hpp"
|
|
#include <signal.h>
|
|
#include "config/ConfigManager.hpp"
|
|
#include "../config/ConfigValue.hpp"
|
|
|
|
CWatchdog::~CWatchdog() {
|
|
m_bExitThread = true;
|
|
m_bNotified = true;
|
|
m_cvWatchdogCondition.notify_all();
|
|
|
|
if (m_pWatchdog && m_pWatchdog->joinable())
|
|
m_pWatchdog->join();
|
|
}
|
|
|
|
CWatchdog::CWatchdog() {
|
|
m_iMainThreadPID = pthread_self();
|
|
|
|
m_pWatchdog = std::make_unique<std::thread>([this] {
|
|
static auto PTIMEOUT = CConfigValue<Hyprlang::INT>("debug:watchdog_timeout");
|
|
|
|
m_bWatchdogInitialized = true;
|
|
while (!m_bExitThread) {
|
|
std::unique_lock<std::mutex> lk(m_mWatchdogMutex);
|
|
|
|
if (!m_bWillWatch)
|
|
m_cvWatchdogCondition.wait(lk, [this] { return m_bNotified || m_bExitThread; });
|
|
else if (m_cvWatchdogCondition.wait_for(lk, std::chrono::milliseconds((int)(*PTIMEOUT * 1000.0)), [this] { return m_bNotified || m_bExitThread; }) == false)
|
|
pthread_kill(m_iMainThreadPID, SIGUSR1);
|
|
|
|
if (m_bExitThread)
|
|
break;
|
|
|
|
m_bWatching = false;
|
|
m_bNotified = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
void CWatchdog::startWatching() {
|
|
static auto PTIMEOUT = CConfigValue<Hyprlang::INT>("debug:watchdog_timeout");
|
|
|
|
if (*PTIMEOUT == 0)
|
|
return;
|
|
|
|
m_tTriggered = std::chrono::high_resolution_clock::now();
|
|
m_bWillWatch = true;
|
|
m_bWatching = true;
|
|
|
|
m_bNotified = true;
|
|
m_cvWatchdogCondition.notify_all();
|
|
}
|
|
|
|
void CWatchdog::endWatching() {
|
|
m_bWatching = false;
|
|
m_bWillWatch = false;
|
|
|
|
m_bNotified = true;
|
|
m_cvWatchdogCondition.notify_all();
|
|
} |