aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/hle/service/am/event_observer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/am/event_observer.h')
-rw-r--r--src/core/hle/service/am/event_observer.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/core/hle/service/am/event_observer.h b/src/core/hle/service/am/event_observer.h
new file mode 100644
index 000000000..3e52e8494
--- /dev/null
+++ b/src/core/hle/service/am/event_observer.h
@@ -0,0 +1,74 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "common/polyfill_thread.h"
+#include "common/thread.h"
+#include "core/hle/service/kernel_helpers.h"
+#include "core/hle/service/os/event.h"
+#include "core/hle/service/os/multi_wait.h"
+
+namespace Core {
+class System;
+}
+
+namespace Service::AM {
+
+struct Applet;
+class ProcessHolder;
+class WindowSystem;
+
+class EventObserver {
+public:
+ explicit EventObserver(Core::System& system, WindowSystem& window_system);
+ ~EventObserver();
+
+ void TrackAppletProcess(Applet& applet);
+ void RequestUpdate();
+
+private:
+ void LinkDeferred();
+ MultiWaitHolder* WaitSignaled();
+ void Process(MultiWaitHolder* holder);
+ bool WaitAndProcessImpl();
+ void LoopProcess();
+
+private:
+ void OnWakeupEvent(MultiWaitHolder* holder);
+ void OnProcessEvent(ProcessHolder* holder);
+
+private:
+ void DestroyAppletProcessHolderLocked(ProcessHolder* holder);
+
+private:
+ void ThreadFunc();
+
+private:
+ // System reference and context.
+ Core::System& m_system;
+ KernelHelpers::ServiceContext m_context;
+
+ // Window manager.
+ WindowSystem& m_window_system;
+
+ // Guest event handle to wake up the event loop processor.
+ Event m_wakeup_event;
+ MultiWaitHolder m_wakeup_holder;
+
+ // Mutex to protect remaining members.
+ std::mutex m_lock{};
+
+ // List of owned process holders.
+ Common::IntrusiveListBaseTraits<ProcessHolder>::ListType m_process_holder_list;
+
+ // Multi-wait objects for new tasks.
+ MultiWait m_multi_wait;
+ MultiWait m_deferred_wait_list;
+
+ // Processing thread.
+ std::thread m_thread{};
+ std::stop_source m_stop_source{};
+};
+
+} // namespace Service::AM