summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt13
-rw-r--r--src/core/hle/service/am/applet.h2
-rw-r--r--src/core/hle/service/am/applet_data_broker.h2
-rw-r--r--src/core/hle/service/os/event.cpp (renamed from src/core/hle/service/event.cpp)2
-rw-r--r--src/core/hle/service/os/event.h (renamed from src/core/hle/service/event.h)0
-rw-r--r--src/core/hle/service/os/multi_wait.cpp59
-rw-r--r--src/core/hle/service/os/multi_wait.h36
-rw-r--r--src/core/hle/service/os/multi_wait_holder.cpp25
-rw-r--r--src/core/hle/service/os/multi_wait_holder.h44
-rw-r--r--src/core/hle/service/os/multi_wait_utils.h109
-rw-r--r--src/core/hle/service/os/mutex.cpp (renamed from src/core/hle/service/mutex.cpp)2
-rw-r--r--src/core/hle/service/os/mutex.h (renamed from src/core/hle/service/mutex.h)0
-rw-r--r--src/core/hle/service/server_manager.h2
13 files changed, 287 insertions, 9 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index eb8f643a2..1b44148f4 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -548,8 +548,6 @@ add_library(core STATIC
548 hle/service/es/es.h 548 hle/service/es/es.h
549 hle/service/eupld/eupld.cpp 549 hle/service/eupld/eupld.cpp
550 hle/service/eupld/eupld.h 550 hle/service/eupld/eupld.h
551 hle/service/event.cpp
552 hle/service/event.h
553 hle/service/fatal/fatal.cpp 551 hle/service/fatal/fatal.cpp
554 hle/service/fatal/fatal.h 552 hle/service/fatal/fatal.h
555 hle/service/fatal/fatal_p.cpp 553 hle/service/fatal/fatal_p.cpp
@@ -676,8 +674,6 @@ add_library(core STATIC
676 hle/service/mm/mm_u.h 674 hle/service/mm/mm_u.h
677 hle/service/mnpp/mnpp_app.cpp 675 hle/service/mnpp/mnpp_app.cpp
678 hle/service/mnpp/mnpp_app.h 676 hle/service/mnpp/mnpp_app.h
679 hle/service/mutex.cpp
680 hle/service/mutex.h
681 hle/service/ncm/ncm.cpp 677 hle/service/ncm/ncm.cpp
682 hle/service/ncm/ncm.h 678 hle/service/ncm/ncm.h
683 hle/service/nfc/common/amiibo_crypto.cpp 679 hle/service/nfc/common/amiibo_crypto.cpp
@@ -790,6 +786,15 @@ add_library(core STATIC
790 hle/service/nvnflinger/window.h 786 hle/service/nvnflinger/window.h
791 hle/service/olsc/olsc.cpp 787 hle/service/olsc/olsc.cpp
792 hle/service/olsc/olsc.h 788 hle/service/olsc/olsc.h
789 hle/service/os/event.cpp
790 hle/service/os/event.h
791 hle/service/os/multi_wait_holder.cpp
792 hle/service/os/multi_wait_holder.h
793 hle/service/os/multi_wait_utils.h
794 hle/service/os/multi_wait.cpp
795 hle/service/os/multi_wait.h
796 hle/service/os/mutex.cpp
797 hle/service/os/mutex.h
793 hle/service/pcie/pcie.cpp 798 hle/service/pcie/pcie.cpp
794 hle/service/pcie/pcie.h 799 hle/service/pcie/pcie.h
795 hle/service/pctl/pctl.cpp 800 hle/service/pctl/pctl.cpp
diff --git a/src/core/hle/service/am/applet.h b/src/core/hle/service/am/applet.h
index bce6f9050..b29ecdfed 100644
--- a/src/core/hle/service/am/applet.h
+++ b/src/core/hle/service/am/applet.h
@@ -9,8 +9,8 @@
9#include "common/math_util.h" 9#include "common/math_util.h"
10#include "core/hle/service/apm/apm_controller.h" 10#include "core/hle/service/apm/apm_controller.h"
11#include "core/hle/service/caps/caps_types.h" 11#include "core/hle/service/caps/caps_types.h"
12#include "core/hle/service/event.h"
13#include "core/hle/service/kernel_helpers.h" 12#include "core/hle/service/kernel_helpers.h"
13#include "core/hle/service/os/event.h"
14#include "core/hle/service/service.h" 14#include "core/hle/service/service.h"
15 15
16#include "core/hle/service/am/am_types.h" 16#include "core/hle/service/am/am_types.h"
diff --git a/src/core/hle/service/am/applet_data_broker.h b/src/core/hle/service/am/applet_data_broker.h
index 12326fd04..5a1d43c11 100644
--- a/src/core/hle/service/am/applet_data_broker.h
+++ b/src/core/hle/service/am/applet_data_broker.h
@@ -7,8 +7,8 @@
7#include <memory> 7#include <memory>
8#include <mutex> 8#include <mutex>
9 9
10#include "core/hle/service/event.h"
11#include "core/hle/service/kernel_helpers.h" 10#include "core/hle/service/kernel_helpers.h"
11#include "core/hle/service/os/event.h"
12 12
13union Result; 13union Result;
14 14
diff --git a/src/core/hle/service/event.cpp b/src/core/hle/service/os/event.cpp
index 375660d72..ec52c17fd 100644
--- a/src/core/hle/service/event.cpp
+++ b/src/core/hle/service/os/event.cpp
@@ -2,8 +2,8 @@
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/hle/kernel/k_event.h" 4#include "core/hle/kernel/k_event.h"
5#include "core/hle/service/event.h"
6#include "core/hle/service/kernel_helpers.h" 5#include "core/hle/service/kernel_helpers.h"
6#include "core/hle/service/os/event.h"
7 7
8namespace Service { 8namespace Service {
9 9
diff --git a/src/core/hle/service/event.h b/src/core/hle/service/os/event.h
index cdbc4635a..cdbc4635a 100644
--- a/src/core/hle/service/event.h
+++ b/src/core/hle/service/os/event.h
diff --git a/src/core/hle/service/os/multi_wait.cpp b/src/core/hle/service/os/multi_wait.cpp
new file mode 100644
index 000000000..7b80d28be
--- /dev/null
+++ b/src/core/hle/service/os/multi_wait.cpp
@@ -0,0 +1,59 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/kernel/k_hardware_timer.h"
5#include "core/hle/kernel/k_synchronization_object.h"
6#include "core/hle/kernel/kernel.h"
7#include "core/hle/kernel/svc_common.h"
8#include "core/hle/service/os/multi_wait.h"
9
10namespace Service {
11
12MultiWait::MultiWait() = default;
13MultiWait::~MultiWait() = default;
14
15MultiWaitHolder* MultiWait::WaitAny(Kernel::KernelCore& kernel) {
16 return this->TimedWaitImpl(kernel, -1);
17}
18
19MultiWaitHolder* MultiWait::TryWaitAny(Kernel::KernelCore& kernel) {
20 return this->TimedWaitImpl(kernel, 0);
21}
22
23MultiWaitHolder* MultiWait::TimedWaitAny(Kernel::KernelCore& kernel, s64 timeout_ns) {
24 return this->TimedWaitImpl(kernel, kernel.HardwareTimer().GetTick() + timeout_ns);
25}
26
27MultiWaitHolder* MultiWait::TimedWaitImpl(Kernel::KernelCore& kernel, s64 timeout_tick) {
28 std::array<MultiWaitHolder*, Kernel::Svc::ArgumentHandleCountMax> holders{};
29 std::array<Kernel::KSynchronizationObject*, Kernel::Svc::ArgumentHandleCountMax> objects{};
30
31 s32 out_index = -1;
32 s32 num_objects = 0;
33
34 for (auto it = m_wait_list.begin(); it != m_wait_list.end(); it++) {
35 ASSERT(num_objects < Kernel::Svc::ArgumentHandleCountMax);
36 holders[num_objects] = std::addressof(*it);
37 objects[num_objects] = it->GetNativeHandle();
38 num_objects++;
39 }
40
41 Kernel::KSynchronizationObject::Wait(kernel, std::addressof(out_index), objects.data(),
42 num_objects, timeout_tick);
43
44 if (out_index == -1) {
45 return nullptr;
46 } else {
47 return holders[out_index];
48 }
49}
50
51void MultiWait::MoveAll(MultiWait* other) {
52 while (!other->m_wait_list.empty()) {
53 MultiWaitHolder& holder = other->m_wait_list.front();
54 holder.UnlinkFromMultiWait();
55 holder.LinkToMultiWait(this);
56 }
57}
58
59} // namespace Service
diff --git a/src/core/hle/service/os/multi_wait.h b/src/core/hle/service/os/multi_wait.h
new file mode 100644
index 000000000..340c611b5
--- /dev/null
+++ b/src/core/hle/service/os/multi_wait.h
@@ -0,0 +1,36 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/os/multi_wait_holder.h"
7
8namespace Kernel {
9class KernelCore;
10}
11
12namespace Service {
13
14class MultiWait final {
15public:
16 explicit MultiWait();
17 ~MultiWait();
18
19public:
20 MultiWaitHolder* WaitAny(Kernel::KernelCore& kernel);
21 MultiWaitHolder* TryWaitAny(Kernel::KernelCore& kernel);
22 MultiWaitHolder* TimedWaitAny(Kernel::KernelCore& kernel, s64 timeout_ns);
23 // TODO: SdkReplyAndReceive?
24
25 void MoveAll(MultiWait* other);
26
27private:
28 MultiWaitHolder* TimedWaitImpl(Kernel::KernelCore& kernel, s64 timeout_tick);
29
30private:
31 friend class MultiWaitHolder;
32 using ListType = Common::IntrusiveListMemberTraits<&MultiWaitHolder::m_list_node>::ListType;
33 ListType m_wait_list{};
34};
35
36} // namespace Service
diff --git a/src/core/hle/service/os/multi_wait_holder.cpp b/src/core/hle/service/os/multi_wait_holder.cpp
new file mode 100644
index 000000000..01efa045b
--- /dev/null
+++ b/src/core/hle/service/os/multi_wait_holder.cpp
@@ -0,0 +1,25 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/os/multi_wait.h"
5#include "core/hle/service/os/multi_wait_holder.h"
6
7namespace Service {
8
9void MultiWaitHolder::LinkToMultiWait(MultiWait* multi_wait) {
10 if (m_multi_wait != nullptr) {
11 UNREACHABLE();
12 }
13
14 m_multi_wait = multi_wait;
15 m_multi_wait->m_wait_list.push_back(*this);
16}
17
18void MultiWaitHolder::UnlinkFromMultiWait() {
19 if (m_multi_wait) {
20 m_multi_wait->m_wait_list.erase(m_multi_wait->m_wait_list.iterator_to(*this));
21 m_multi_wait = nullptr;
22 }
23}
24
25} // namespace Service
diff --git a/src/core/hle/service/os/multi_wait_holder.h b/src/core/hle/service/os/multi_wait_holder.h
new file mode 100644
index 000000000..646395a3f
--- /dev/null
+++ b/src/core/hle/service/os/multi_wait_holder.h
@@ -0,0 +1,44 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "common/intrusive_list.h"
7
8namespace Kernel {
9class KSynchronizationObject;
10} // namespace Kernel
11
12namespace Service {
13
14class MultiWait;
15
16class MultiWaitHolder {
17public:
18 explicit MultiWaitHolder(Kernel::KSynchronizationObject* native_handle)
19 : m_native_handle(native_handle) {}
20
21 void LinkToMultiWait(MultiWait* multi_wait);
22 void UnlinkFromMultiWait();
23
24 void SetUserData(uintptr_t user_data) {
25 m_user_data = user_data;
26 }
27
28 uintptr_t GetUserData() const {
29 return m_user_data;
30 }
31
32 Kernel::KSynchronizationObject* GetNativeHandle() const {
33 return m_native_handle;
34 }
35
36private:
37 friend class MultiWait;
38 Common::IntrusiveListNode m_list_node{};
39 MultiWait* m_multi_wait{};
40 Kernel::KSynchronizationObject* m_native_handle{};
41 uintptr_t m_user_data{};
42};
43
44} // namespace Service
diff --git a/src/core/hle/service/os/multi_wait_utils.h b/src/core/hle/service/os/multi_wait_utils.h
new file mode 100644
index 000000000..96d3a10f3
--- /dev/null
+++ b/src/core/hle/service/os/multi_wait_utils.h
@@ -0,0 +1,109 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "core/hle/service/os/multi_wait.h"
7
8namespace Service {
9
10namespace impl {
11
12class AutoMultiWaitHolder {
13private:
14 MultiWaitHolder m_holder;
15
16public:
17 template <typename T>
18 explicit AutoMultiWaitHolder(MultiWait* multi_wait, T&& arg) : m_holder(arg) {
19 m_holder.LinkToMultiWait(multi_wait);
20 }
21
22 ~AutoMultiWaitHolder() {
23 m_holder.UnlinkFromMultiWait();
24 }
25
26 std::pair<MultiWaitHolder*, int> ConvertResult(const std::pair<MultiWaitHolder*, int> result,
27 int index) {
28 if (result.first == std::addressof(m_holder)) {
29 return std::make_pair(static_cast<MultiWaitHolder*>(nullptr), index);
30 } else {
31 return result;
32 }
33 }
34};
35
36using WaitAnyFunction = decltype(&MultiWait::WaitAny);
37
38inline std::pair<MultiWaitHolder*, int> WaitAnyImpl(Kernel::KernelCore& kernel,
39 MultiWait* multi_wait, WaitAnyFunction func,
40 int) {
41 return std::pair<MultiWaitHolder*, int>((multi_wait->*func)(kernel), -1);
42}
43
44template <typename T, typename... Args>
45inline std::pair<MultiWaitHolder*, int> WaitAnyImpl(Kernel::KernelCore& kernel,
46 MultiWait* multi_wait, WaitAnyFunction func,
47 int index, T&& x, Args&&... args) {
48 AutoMultiWaitHolder holder(multi_wait, std::forward<T>(x));
49 return holder.ConvertResult(
50 WaitAnyImpl(kernel, multi_wait, func, index + 1, std::forward<Args>(args)...), index);
51}
52
53template <typename... Args>
54inline std::pair<MultiWaitHolder*, int> WaitAnyImpl(Kernel::KernelCore& kernel,
55 MultiWait* multi_wait, WaitAnyFunction func,
56 Args&&... args) {
57 return WaitAnyImpl(kernel, multi_wait, func, 0, std::forward<Args>(args)...);
58}
59
60template <typename... Args>
61inline std::pair<MultiWaitHolder*, int> WaitAnyImpl(Kernel::KernelCore& kernel,
62 WaitAnyFunction func, Args&&... args) {
63 MultiWait temp_multi_wait;
64 return WaitAnyImpl(kernel, std::addressof(temp_multi_wait), func, 0,
65 std::forward<Args>(args)...);
66}
67
68class NotBoolButInt {
69public:
70 constexpr NotBoolButInt(int v) : m_value(v) {}
71 constexpr operator int() const {
72 return m_value;
73 }
74 explicit operator bool() const = delete;
75
76private:
77 int m_value;
78};
79
80} // namespace impl
81
82template <typename... Args>
83 requires(sizeof...(Args) > 0)
84inline std::pair<MultiWaitHolder*, int> WaitAny(Kernel::KernelCore& kernel, MultiWait* multi_wait,
85 Args&&... args) {
86 return impl::WaitAnyImpl(kernel, &MultiWait::WaitAny, multi_wait, std::forward<Args>(args)...);
87}
88
89template <typename... Args>
90 requires(sizeof...(Args) > 0)
91inline int WaitAny(Kernel::KernelCore& kernel, Args&&... args) {
92 return impl::WaitAnyImpl(kernel, &MultiWait::WaitAny, std::forward<Args>(args)...).second;
93}
94
95template <typename... Args>
96 requires(sizeof...(Args) > 0)
97inline std::pair<MultiWaitHolder*, int> TryWaitAny(Kernel::KernelCore& kernel,
98 MultiWait* multi_wait, Args&&... args) {
99 return impl::WaitAnyImpl(kernel, &MultiWait::TryWaitAny, multi_wait,
100 std::forward<Args>(args)...);
101}
102
103template <typename... Args>
104 requires(sizeof...(Args) > 0)
105inline impl::NotBoolButInt TryWaitAny(Kernel::KernelCore& kernel, Args&&... args) {
106 return impl::WaitAnyImpl(kernel, &MultiWait::TryWaitAny, std::forward<Args>(args)...).second;
107}
108
109} // namespace Service
diff --git a/src/core/hle/service/mutex.cpp b/src/core/hle/service/os/mutex.cpp
index b0ff71d1b..6009f4866 100644
--- a/src/core/hle/service/mutex.cpp
+++ b/src/core/hle/service/os/mutex.cpp
@@ -4,7 +4,7 @@
4#include "core/core.h" 4#include "core/core.h"
5#include "core/hle/kernel/k_event.h" 5#include "core/hle/kernel/k_event.h"
6#include "core/hle/kernel/k_synchronization_object.h" 6#include "core/hle/kernel/k_synchronization_object.h"
7#include "core/hle/service/mutex.h" 7#include "core/hle/service/os/mutex.h"
8 8
9namespace Service { 9namespace Service {
10 10
diff --git a/src/core/hle/service/mutex.h b/src/core/hle/service/os/mutex.h
index 95ac9b117..95ac9b117 100644
--- a/src/core/hle/service/mutex.h
+++ b/src/core/hle/service/os/mutex.h
diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h
index c4bc07262..7481c8521 100644
--- a/src/core/hle/service/server_manager.h
+++ b/src/core/hle/service/server_manager.h
@@ -14,7 +14,7 @@
14#include "common/thread.h" 14#include "common/thread.h"
15#include "core/hle/result.h" 15#include "core/hle/result.h"
16#include "core/hle/service/hle_ipc.h" 16#include "core/hle/service/hle_ipc.h"
17#include "core/hle/service/mutex.h" 17#include "core/hle/service/os/mutex.h"
18 18
19namespace Core { 19namespace Core {
20class System; 20class System;