From ea17a74b4252dd186cc97586e38b0680c9b6b2b3 Mon Sep 17 00:00:00 2001 From: Mykhailo Lohvynenko Date: Wed, 15 Apr 2026 12:12:07 +0300 Subject: [PATCH] resourcemanager: check if device exists dynamically This patch uses std::filesystem to check if the device exists instead of checking if it is in the list of devices. This allows to check for devices that are plugged in after the ResourceManager is initialized. As well as to check devices multiple subfolders deep, e.g. /dev/dri/card0. Signed-off-by: Mykhailo Lohvynenko --- external/aos_core_common_cpp | 2 +- src/resourcemanager/resourcemanager.cpp | 10 ++++------ src/resourcemanager/resourcemanager.hpp | 4 +--- tests/resourcemanager/resourcemanager_test.cpp | 14 +++++++++++++- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/external/aos_core_common_cpp b/external/aos_core_common_cpp index 24dc42f1..c72bcca6 160000 --- a/external/aos_core_common_cpp +++ b/external/aos_core_common_cpp @@ -1 +1 @@ -Subproject commit 24dc42f153256ff6b35db261ac3b18d950233134 +Subproject commit c72bcca606e8c4352cbd150600c07ecca62bad79 diff --git a/src/resourcemanager/resourcemanager.cpp b/src/resourcemanager/resourcemanager.cpp index f6f1c56b..5858d828 100644 --- a/src/resourcemanager/resourcemanager.cpp +++ b/src/resourcemanager/resourcemanager.cpp @@ -25,10 +25,6 @@ namespace aos::sm::resourcemanager { Error HostDeviceManager::Init() { try { - for (const auto& entry : std::filesystem::directory_iterator(cDevicesDirectory)) { - mDevices.insert(entry.path().string()); - } - if (auto err = ParseGroups(); !err.IsNone()) { return AOS_ERROR_WRAP(err); } @@ -51,8 +47,10 @@ Error HostDeviceManager::CheckDevice(const String& device) const return AOS_ERROR_WRAP(ErrorEnum::eFailed); } - if (mDevices.find(devices[0].CStr()) == mDevices.end()) { - return AOS_ERROR_WRAP(ErrorEnum::eNotFound); + std::error_code ec; + + if (!std::filesystem::exists(devices[0].CStr(), ec) || ec.value() != 0) { + return AOS_ERROR_WRAP(Error(ErrorEnum::eNotFound, ec.message().c_str())); } return ErrorEnum::eNone; diff --git a/src/resourcemanager/resourcemanager.hpp b/src/resourcemanager/resourcemanager.hpp index 691c8b1a..1af0fec9 100644 --- a/src/resourcemanager/resourcemanager.hpp +++ b/src/resourcemanager/resourcemanager.hpp @@ -44,12 +44,10 @@ class HostDeviceManager : public sm::resourcemanager::HostDeviceManagerItf { Error CheckGroup(const String& group) const override; private: - static constexpr auto cDevicesDirectory = "/dev/"; - static constexpr auto cGroupsFile = "/etc/group"; + static constexpr auto cGroupsFile = "/etc/group"; Error ParseGroups(); - std::set mDevices; std::set mGroups; }; diff --git a/tests/resourcemanager/resourcemanager_test.cpp b/tests/resourcemanager/resourcemanager_test.cpp index 39ef982e..d99f075e 100644 --- a/tests/resourcemanager/resourcemanager_test.cpp +++ b/tests/resourcemanager/resourcemanager_test.cpp @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include + #include #include @@ -17,7 +19,14 @@ namespace aos::sm::resourcemanager { class ResourcemanagerTest : public Test { public: - void SetUp() override { test::InitLog(); } + void SetUp() override + { + test::InitLog(); + + std::filesystem::create_directories("test/dev/dri/card0"); + } + + void TearDown() override { std::filesystem::remove_all("test"); } HostDeviceManager mHostDeviceManager; }; @@ -35,6 +44,9 @@ TEST_F(ResourcemanagerTest, CheckDevice) err = mHostDeviceManager.CheckDevice("/dev/null:/dev/test"); EXPECT_TRUE(err.IsNone()) << test::ErrorToStr(err); + + err = mHostDeviceManager.CheckDevice("test/dev/dri/card0:/dev/dri/card0"); + EXPECT_TRUE(err.IsNone()) << test::ErrorToStr(err); } TEST_F(ResourcemanagerTest, CheckDeviceReturnsNotFound)