From e600b0f96ec06e83a9b5a08a8e44bca001d940fc Mon Sep 17 00:00:00 2001 From: Hayodea Hekol Date: Tue, 30 Sep 2025 18:12:20 -0400 Subject: [PATCH] DevMgr:at/detachSenseDevReq: acquire Api lib Qutex --- include/lockSet.h | 2 ++ smocore/deviceManager/deviceManager.cpp | 47 ++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/include/lockSet.h b/include/lockSet.h index 9b46a73..7d6d6a7 100644 --- a/include/lockSet.h +++ b/include/lockSet.h @@ -34,6 +34,8 @@ public: std::reference_wrapper, typename LockerAndInvokerBase::List::iterator> LockUsageDesc; + typedef std::vector> Set; + public: /** * @brief Constructor diff --git a/smocore/deviceManager/deviceManager.cpp b/smocore/deviceManager/deviceManager.cpp index af2713e..8806702 100644 --- a/smocore/deviceManager/deviceManager.cpp +++ b/smocore/deviceManager/deviceManager.cpp @@ -323,9 +323,10 @@ public: AttachSenseDeviceReq( const std::shared_ptr& spec, const std::shared_ptr &caller, - Callback cb) + Callback cb, + std::vector> requiredLocks) : SerializedAsynchronousContinuation( - caller, cb, {std::ref(DeviceManager::getInstance().qutex)}), + caller, cb, requiredLocks), spec(spec) {} @@ -467,8 +468,27 @@ void DeviceManager::attachSenseDeviceReq( ) { const auto& caller = ComponentThread::getSelf(); + + // Get the sense API lib's qutex + auto libOpt = sense_api::SenseApiManager::getInstance() + .getSenseApiLibByApiName(spec->api); + + if (!libOpt) + { + std::cerr << "attachSenseDeviceReq: No library found for API '" + << spec->api << "'" << std::endl; + cb.callbackFn(false, spec); + return; + } + + auto& lib = *libOpt.value(); + auto request = std::make_shared( - spec, caller, cb); + spec, caller, cb, + LockSet::Set{ + std::ref(DeviceManager::getInstance().qutex), + std::ref(lib.qutex) + }); AttachSenseDeviceReq::LockerAndInvoker lockvoker( *request, mrntt::mrntt.thread, @@ -483,8 +503,27 @@ void DeviceManager::detachSenseDeviceReq( ) { const auto& caller = ComponentThread::getSelf(); + + // Get the sense API lib's qutex + auto libOpt = sense_api::SenseApiManager::getInstance() + .getSenseApiLibByApiName(spec->api); + + if (!libOpt) + { + std::cerr << "detachSenseDeviceReq: No library found for API '" + << spec->api << "'" << std::endl; + cb.callbackFn(false, spec); + return; + } + + auto& lib = *libOpt.value(); + auto request = std::make_shared( - spec, caller, cb); + spec, caller, cb, + LockSet::Set{ + std::ref(DeviceManager::getInstance().qutex), + std::ref(lib.qutex) + }); DetachSenseDeviceReq::LockerAndInvoker lockvoker( *request, mrntt::mrntt.thread,