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>
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 @@
 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 @@
     return;
   }
 
-  uevent_listener_.RegisterHotplugHandler([this] {
+  uevent_listener_->RegisterHotplugHandler([this] {
     const std::lock_guard<std::mutex> lock(GetMainLock());
     UpdateFrontendDisplays();
   });
@@ -103,7 +97,7 @@
     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 @@
   ResourceManager &operator=(const ResourceManager &) = delete;
   ResourceManager(const ResourceManager &&) = delete;
   ResourceManager &&operator=(const ResourceManager &&) = delete;
-  ~ResourceManager();
+  ~ResourceManager() = default;
 
   void Init();
 
@@ -66,7 +67,7 @@
 
   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 {};
 
-  return InitWorker();
+  std::thread(&UEventListener::ThreadFn, uel.get(), uel).detach();
+
+  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 @@
       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_;