From 7fccbaadca849dcf3245443a3af5027ed84b9d62 Mon Sep 17 00:00:00 2001 From: aexzhou Date: Sat, 14 Feb 2026 15:10:55 -0800 Subject: [PATCH] Fix: Application hangs during initialization due to deadlock --- client/include/client/config_manager.hpp | 2 +- client/src/config_manager.cpp | 18 +++++++++--------- client/src/main.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/include/client/config_manager.hpp b/client/include/client/config_manager.hpp index 5363e1d8..87de2a01 100644 --- a/client/include/client/config_manager.hpp +++ b/client/include/client/config_manager.hpp @@ -39,7 +39,7 @@ class ConfigManager { std::string runtimeDir_; std::map configData_; - mutable std::mutex mutex_; + mutable std::recursive_mutex mutex_; bool createDirectoryStructure(); bool testDirectoryWritable(const std::string& path); diff --git a/client/src/config_manager.cpp b/client/src/config_manager.cpp index c598eb57..bb2e1682 100644 --- a/client/src/config_manager.cpp +++ b/client/src/config_manager.cpp @@ -15,7 +15,7 @@ ConfigManager& ConfigManager::getInstance() { } bool ConfigManager::setRuntimeDirectory(const std::string& path) { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); // Verify directory exists if (!std::filesystem::exists(path)) { @@ -46,17 +46,17 @@ bool ConfigManager::setRuntimeDirectory(const std::string& path) { } std::string ConfigManager::getRuntimeDirectory() const { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); return runtimeDir_; } bool ConfigManager::hasRuntimeDirectory() const { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); return !runtimeDir_.empty(); } std::string ConfigManager::getDataLogPath() const { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); if (runtimeDir_.empty()) { return ""; } @@ -64,7 +64,7 @@ std::string ConfigManager::getDataLogPath() const { } std::string ConfigManager::getConfigPath() const { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); if (runtimeDir_.empty()) { return ""; } @@ -201,14 +201,14 @@ bool ConfigManager::saveToJson() { } bool ConfigManager::saveConfig(const std::string& key, const std::string& value) { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); configData_[key] = value; return saveToJson(); } std::string ConfigManager::getConfig(const std::string& key) { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); auto it = configData_.find(key); if (it != configData_.end()) { @@ -218,7 +218,7 @@ std::string ConfigManager::getConfig(const std::string& key) { } bool ConfigManager::saveTcpSettings(const std::string& host, int port, bool autoReconnect, int reconnectDelay) { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); configData_["tcp_host"] = host; configData_["tcp_port"] = std::to_string(port); @@ -229,7 +229,7 @@ bool ConfigManager::saveTcpSettings(const std::string& host, int port, bool auto } bool ConfigManager::getTcpSettings(std::string& host, int& port, bool& autoReconnect, int& reconnectDelay) { - std::lock_guard lock(mutex_); + std::lock_guard lock(mutex_); auto hostIt = configData_.find("tcp_host"); auto portIt = configData_.find("tcp_port"); diff --git a/client/src/main.cpp b/client/src/main.cpp index 72e3caa1..4025d35f 100644 --- a/client/src/main.cpp +++ b/client/src/main.cpp @@ -142,7 +142,7 @@ class PanoramaClient : public wxApp { if (parser.isNoGuiMode()) { cout << "Running in console mode (no GUI). Press Ctrl+C to exit.\n"; cout << "Listening for JSON stream...\n\n"; - + while (true) { std::this_thread::sleep_for(std::chrono::seconds(1)); // Run forever in console }