aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Stratiienko <r.stratiienko@gmail.com>2022-12-28 18:51:37 +0200
committerRoman Stratiienko <r.stratiienko@gmail.com>2022-12-28 18:56:03 +0200
commit4719abbcf36ca7a584d592da017586d07033fd8b (patch)
tree24f63796d6dfa000b3ca8be04f920f6061e40f46
parent3295719124162e5091168173064fedf1cd28f5d3 (diff)
downloaddrm_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.cpp12
-rw-r--r--drm/ResourceManager.h5
-rw-r--r--drm/UEventListener.cpp32
-rw-r--r--drm/UEventListener.h15
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_;