From 6c52e3ce11bd5b0fc3230490c94325c424f84b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=A9rence=20Clastres?= Date: Wed, 12 Aug 2020 20:01:21 +0200 Subject: [PATCH] Fix hang when deleting busses --- ResourceManager.cpp | 2 +- i2c_smbus/i2c_smbus.cpp | 10 ++++++++++ i2c_smbus/i2c_smbus.h | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ResourceManager.cpp b/ResourceManager.cpp index 139cbf2f7..8641aa66d 100644 --- a/ResourceManager.cpp +++ b/ResourceManager.cpp @@ -32,7 +32,7 @@ ResourceManager::~ResourceManager() for(i2c_smbus_interface* bus : busses) { - //delete bus; + delete bus; } DetectDevicesThread->join(); diff --git a/i2c_smbus/i2c_smbus.cpp b/i2c_smbus/i2c_smbus.cpp index de59638b0..0db701a43 100644 --- a/i2c_smbus/i2c_smbus.cpp +++ b/i2c_smbus/i2c_smbus.cpp @@ -24,11 +24,16 @@ i2c_smbus_interface::i2c_smbus_interface() this->pci_vendor = -1; this->pci_subsystem_device = -1; this->pci_subsystem_vendor = -1; + i2c_smbus_thread_running = true; i2c_smbus_thread = new std::thread(&i2c_smbus_interface::i2c_smbus_thread_function, this); } i2c_smbus_interface::~i2c_smbus_interface() { + i2c_smbus_thread_running = false; + i2c_smbus_start = true; + i2c_smbus_start_cv.notify_all(); + i2c_smbus_thread->join(); delete i2c_smbus_thread; } @@ -190,6 +195,11 @@ void i2c_smbus_interface::i2c_smbus_thread_function() i2c_smbus_start_cv.wait(start_lock, [this]{ return i2c_smbus_start.load(); }); i2c_smbus_start = false; + if (!i2c_smbus_thread_running.load()) + { + break; + } + i2c_ret = i2c_smbus_xfer(i2c_addr, i2c_read_write, i2c_command, i2c_size, i2c_data); std::unique_lock done_lock(i2c_smbus_done_mutex); diff --git a/i2c_smbus/i2c_smbus.h b/i2c_smbus/i2c_smbus.h index d8501d483..976af0efc 100644 --- a/i2c_smbus/i2c_smbus.h +++ b/i2c_smbus/i2c_smbus.h @@ -89,7 +89,8 @@ public: virtual s32 i2c_smbus_xfer(u8 addr, char read_write, u8 command, int size, i2c_smbus_data* data) = 0; private: - std::thread * i2c_smbus_thread; + std::thread * i2c_smbus_thread; + std::atomic i2c_smbus_thread_running; std::atomic i2c_smbus_start; std::condition_variable i2c_smbus_start_cv;