diff options
author | Roman Stratiienko <r.stratiienko@gmail.com> | 2022-12-28 18:51:37 +0200 |
---|---|---|
committer | Roman Stratiienko <r.stratiienko@gmail.com> | 2022-12-28 18:56:03 +0200 |
commit | 4719abbcf36ca7a584d592da017586d07033fd8b (patch) | |
tree | 24f63796d6dfa000b3ca8be04f920f6061e40f46 | |
parent | 3295719124162e5091168173064fedf1cd28f5d3 (diff) | |
download | drm_hwcomposer-4719abbcf36ca7a584d592da017586d07033fd8b.tar.gz |
drm_hwcomposer: Rework UEventListener to work without utils/worker
utils/worker just complicates the logic without providing any benefit.
Change-Id: I0e6427492b8298c6c327c1edb660c8a9789f706f
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
-rw-r--r-- | drm/ResourceManager.cpp | 12 | ||||
-rw-r--r-- | drm/ResourceManager.h | 5 | ||||
-rw-r--r-- | drm/UEventListener.cpp | 32 | ||||
-rw-r--r-- | drm/UEventListener.h | 15 |
4 files changed, 30 insertions, 34 deletions
diff --git a/drm/ResourceManager.cpp b/drm/ResourceManager.cpp index fb5c32b..f64cae4 100644 --- a/drm/ResourceManager.cpp +++ b/drm/ResourceManager.cpp @@ -36,13 +36,7 @@ namespace android { ResourceManager::ResourceManager( PipelineToFrontendBindingInterface *p2f_bind_interface) : frontend_interface_(p2f_bind_interface) { - if (uevent_listener_.Init() != 0) { - ALOGE("Can't initialize event listener"); - } -} - -ResourceManager::~ResourceManager() { - uevent_listener_.Exit(); + uevent_listener_ = UEventListener::CreateInstance(); } void ResourceManager::Init() { @@ -87,7 +81,7 @@ void ResourceManager::Init() { return; } - uevent_listener_.RegisterHotplugHandler([this] { + uevent_listener_->RegisterHotplugHandler([this] { const std::lock_guard<std::mutex> lock(GetMainLock()); UpdateFrontendDisplays(); }); @@ -103,7 +97,7 @@ void ResourceManager::DeInit() { return; } - uevent_listener_.RegisterHotplugHandler([] {}); + uevent_listener_->RegisterHotplugHandler({}); DetachAllFrontendDisplays(); drms_.clear(); diff --git a/drm/ResourceManager.h b/drm/ResourceManager.h index fb91627..8e047a3 100644 --- a/drm/ResourceManager.h +++ b/drm/ResourceManager.h @@ -17,6 +17,7 @@ #pragma once #include <cstring> +#include <mutex> #include "DrmDevice.h" #include "DrmDisplayPipeline.h" @@ -41,7 +42,7 @@ class ResourceManager { ResourceManager &operator=(const ResourceManager &) = delete; ResourceManager(const ResourceManager &&) = delete; ResourceManager &&operator=(const ResourceManager &&) = delete; - ~ResourceManager(); + ~ResourceManager() = default; void Init(); @@ -66,7 +67,7 @@ class ResourceManager { bool scale_with_gpu_{}; - UEventListener uevent_listener_; + std::shared_ptr<UEventListener> uevent_listener_; std::mutex main_lock_; diff --git a/drm/UEventListener.cpp b/drm/UEventListener.cpp index 79f23c4..a05ec65 100644 --- a/drm/UEventListener.cpp +++ b/drm/UEventListener.cpp @@ -18,31 +18,31 @@ #include "UEventListener.h" -#include <cerrno> +#include <thread> #include "utils/log.h" -/* Originally defined in system/core/libsystem/include/system/graphics.h as - * #define HAL_PRIORITY_URGENT_DISPLAY (-8)*/ -constexpr int kHalPriorityUrgentDisplay = -8; - namespace android { -UEventListener::UEventListener() - : Worker("uevent-listener", kHalPriorityUrgentDisplay){}; +auto UEventListener::CreateInstance() -> std::shared_ptr<UEventListener> { + auto uel = std::shared_ptr<UEventListener>(new UEventListener()); -int UEventListener::Init() { - uevent_ = UEvent::CreateInstance(); - if (!uevent_) { - return -ENODEV; - } + uel->uevent_ = UEvent::CreateInstance(); + if (!uel->uevent_) + return {}; + + std::thread(&UEventListener::ThreadFn, uel.get(), uel).detach(); - return InitWorker(); + return uel; } -void UEventListener::Routine() { +void UEventListener::ThreadFn(const std::shared_ptr<UEventListener> &uel) { + // TODO(nobody): Rework code to allow stopping the thread (low priority) while (true) { - auto uevent_str = uevent_->ReadNext(); + if (uel.use_count() == 1) + break; + + auto uevent_str = uel->uevent_->ReadNext(); if (!hotplug_handler_ || !uevent_str) continue; @@ -58,5 +58,7 @@ void UEventListener::Routine() { hotplug_handler_(); } } + + ALOGI("UEvent thread exit"); } } // namespace android diff --git a/drm/UEventListener.h b/drm/UEventListener.h index 4fefdec..4f2be7c 100644 --- a/drm/UEventListener.h +++ b/drm/UEventListener.h @@ -19,25 +19,24 @@ #include <functional> #include "utils/UEvent.h" -#include "utils/Worker.h" namespace android { -class UEventListener : public Worker { +class UEventListener { public: - UEventListener(); - ~UEventListener() override = default; + ~UEventListener() = default; - int Init(); + static auto CreateInstance() -> std::shared_ptr<UEventListener>; void RegisterHotplugHandler(std::function<void()> hotplug_handler) { hotplug_handler_ = std::move(hotplug_handler); } - protected: - void Routine() override; - private: + UEventListener() = default; + + void ThreadFn(const std::shared_ptr<UEventListener> &uel); + std::unique_ptr<UEvent> uevent_; std::function<void()> hotplug_handler_; |