diff options
28 files changed, 196 insertions, 226 deletions
diff --git a/src/core/hle/kernel/k_affinity_mask.h b/src/core/hle/kernel/k_affinity_mask.h index b58716e90..07a5a822c 100644 --- a/src/core/hle/kernel/k_affinity_mask.h +++ b/src/core/hle/kernel/k_affinity_mask.h | |||
| @@ -13,40 +13,40 @@ class KAffinityMask { | |||
| 13 | public: | 13 | public: |
| 14 | constexpr KAffinityMask() = default; | 14 | constexpr KAffinityMask() = default; |
| 15 | 15 | ||
| 16 | [[nodiscard]] constexpr u64 GetAffinityMask() const { | 16 | constexpr u64 GetAffinityMask() const { |
| 17 | return this->mask; | 17 | return m_mask; |
| 18 | } | 18 | } |
| 19 | 19 | ||
| 20 | constexpr void SetAffinityMask(u64 new_mask) { | 20 | constexpr void SetAffinityMask(u64 new_mask) { |
| 21 | ASSERT((new_mask & ~AllowedAffinityMask) == 0); | 21 | ASSERT((new_mask & ~AllowedAffinityMask) == 0); |
| 22 | this->mask = new_mask; | 22 | m_mask = new_mask; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | [[nodiscard]] constexpr bool GetAffinity(s32 core) const { | 25 | constexpr bool GetAffinity(s32 core) const { |
| 26 | return (this->mask & GetCoreBit(core)) != 0; | 26 | return (m_mask & GetCoreBit(core)) != 0; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | constexpr void SetAffinity(s32 core, bool set) { | 29 | constexpr void SetAffinity(s32 core, bool set) { |
| 30 | if (set) { | 30 | if (set) { |
| 31 | this->mask |= GetCoreBit(core); | 31 | m_mask |= GetCoreBit(core); |
| 32 | } else { | 32 | } else { |
| 33 | this->mask &= ~GetCoreBit(core); | 33 | m_mask &= ~GetCoreBit(core); |
| 34 | } | 34 | } |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | constexpr void SetAll() { | 37 | constexpr void SetAll() { |
| 38 | this->mask = AllowedAffinityMask; | 38 | m_mask = AllowedAffinityMask; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | private: | 41 | private: |
| 42 | [[nodiscard]] static constexpr u64 GetCoreBit(s32 core) { | 42 | static constexpr u64 GetCoreBit(s32 core) { |
| 43 | ASSERT(0 <= core && core < static_cast<s32>(Core::Hardware::NUM_CPU_CORES)); | 43 | ASSERT(0 <= core && core < static_cast<s32>(Core::Hardware::NUM_CPU_CORES)); |
| 44 | return (1ULL << core); | 44 | return (1ULL << core); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | static constexpr u64 AllowedAffinityMask = (1ULL << Core::Hardware::NUM_CPU_CORES) - 1; | 47 | static constexpr u64 AllowedAffinityMask = (1ULL << Core::Hardware::NUM_CPU_CORES) - 1; |
| 48 | 48 | ||
| 49 | u64 mask{}; | 49 | u64 m_mask{}; |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | } // namespace Kernel | 52 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h index e8118c2b8..2443ab2a5 100644 --- a/src/core/hle/kernel/k_auto_object.h +++ b/src/core/hle/kernel/k_auto_object.h | |||
| @@ -164,17 +164,12 @@ public: | |||
| 164 | } | 164 | } |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | const std::string& GetName() const { | ||
| 168 | return name; | ||
| 169 | } | ||
| 170 | |||
| 171 | private: | 167 | private: |
| 172 | void RegisterWithKernel(); | 168 | void RegisterWithKernel(); |
| 173 | void UnregisterWithKernel(); | 169 | void UnregisterWithKernel(); |
| 174 | 170 | ||
| 175 | protected: | 171 | protected: |
| 176 | KernelCore& kernel; | 172 | KernelCore& kernel; |
| 177 | std::string name; | ||
| 178 | 173 | ||
| 179 | private: | 174 | private: |
| 180 | std::atomic<u32> m_ref_count{}; | 175 | std::atomic<u32> m_ref_count{}; |
| @@ -208,10 +203,6 @@ public: | |||
| 208 | return reinterpret_cast<u64>(this); | 203 | return reinterpret_cast<u64>(this); |
| 209 | } | 204 | } |
| 210 | 205 | ||
| 211 | virtual const std::string& GetName() const { | ||
| 212 | return name; | ||
| 213 | } | ||
| 214 | |||
| 215 | private: | 206 | private: |
| 216 | friend class KAutoObjectWithListContainer; | 207 | friend class KAutoObjectWithListContainer; |
| 217 | }; | 208 | }; |
diff --git a/src/core/hle/kernel/k_capabilities.cpp b/src/core/hle/kernel/k_capabilities.cpp index 2907cc6e3..90e4e8fb0 100644 --- a/src/core/hle/kernel/k_capabilities.cpp +++ b/src/core/hle/kernel/k_capabilities.cpp | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | namespace Kernel { | 12 | namespace Kernel { |
| 13 | 13 | ||
| 14 | Result KCapabilities::InitializeForKIP(std::span<const u32> kern_caps, KPageTable* page_table) { | 14 | Result KCapabilities::InitializeForKip(std::span<const u32> kern_caps, KPageTable* page_table) { |
| 15 | // We're initializing an initial process. | 15 | // We're initializing an initial process. |
| 16 | m_svc_access_flags.reset(); | 16 | m_svc_access_flags.reset(); |
| 17 | m_irq_access_flags.reset(); | 17 | m_irq_access_flags.reset(); |
diff --git a/src/core/hle/kernel/k_capabilities.h b/src/core/hle/kernel/k_capabilities.h index cd96f8d23..de766c811 100644 --- a/src/core/hle/kernel/k_capabilities.h +++ b/src/core/hle/kernel/k_capabilities.h | |||
| @@ -22,7 +22,7 @@ class KCapabilities { | |||
| 22 | public: | 22 | public: |
| 23 | constexpr explicit KCapabilities() = default; | 23 | constexpr explicit KCapabilities() = default; |
| 24 | 24 | ||
| 25 | Result InitializeForKIP(std::span<const u32> kern_caps, KPageTable* page_table); | 25 | Result InitializeForKip(std::span<const u32> kern_caps, KPageTable* page_table); |
| 26 | Result InitializeForUser(std::span<const u32> user_caps, KPageTable* page_table); | 26 | Result InitializeForUser(std::span<const u32> user_caps, KPageTable* page_table); |
| 27 | 27 | ||
| 28 | static Result CheckCapabilities(KernelCore& kernel, std::span<const u32> user_caps); | 28 | static Result CheckCapabilities(KernelCore& kernel, std::span<const u32> user_caps); |
diff --git a/src/core/hle/kernel/k_client_port.cpp b/src/core/hle/kernel/k_client_port.cpp index 700ae71e3..7a3d650fd 100644 --- a/src/core/hle/kernel/k_client_port.cpp +++ b/src/core/hle/kernel/k_client_port.cpp | |||
| @@ -14,23 +14,18 @@ namespace Kernel { | |||
| 14 | KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} | 14 | KClientPort::KClientPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} |
| 15 | KClientPort::~KClientPort() = default; | 15 | KClientPort::~KClientPort() = default; |
| 16 | 16 | ||
| 17 | void KClientPort::Initialize(KPort* parent_port_, s32 max_sessions_, std::string&& name_) { | 17 | void KClientPort::Initialize(KPort* parent, s32 max_sessions) { |
| 18 | // Set member variables. | 18 | // Set member variables. |
| 19 | num_sessions = 0; | 19 | m_num_sessions = 0; |
| 20 | peak_sessions = 0; | 20 | m_peak_sessions = 0; |
| 21 | parent = parent_port_; | 21 | m_parent = parent; |
| 22 | max_sessions = max_sessions_; | 22 | m_max_sessions = max_sessions; |
| 23 | name = std::move(name_); | ||
| 24 | } | 23 | } |
| 25 | 24 | ||
| 26 | void KClientPort::OnSessionFinalized() { | 25 | void KClientPort::OnSessionFinalized() { |
| 27 | KScopedSchedulerLock sl{kernel}; | 26 | KScopedSchedulerLock sl{kernel}; |
| 28 | 27 | ||
| 29 | // This might happen if a session was improperly used with this port. | 28 | if (const auto prev = m_num_sessions--; prev == m_max_sessions) { |
| 30 | ASSERT_MSG(num_sessions > 0, "num_sessions is invalid"); | ||
| 31 | |||
| 32 | const auto prev = num_sessions--; | ||
| 33 | if (prev == max_sessions) { | ||
| 34 | this->NotifyAvailable(); | 29 | this->NotifyAvailable(); |
| 35 | } | 30 | } |
| 36 | } | 31 | } |
| @@ -47,81 +42,81 @@ bool KClientPort::IsServerClosed() const { | |||
| 47 | 42 | ||
| 48 | void KClientPort::Destroy() { | 43 | void KClientPort::Destroy() { |
| 49 | // Note with our parent that we're closed. | 44 | // Note with our parent that we're closed. |
| 50 | parent->OnClientClosed(); | 45 | m_parent->OnClientClosed(); |
| 51 | 46 | ||
| 52 | // Close our reference to our parent. | 47 | // Close our reference to our parent. |
| 53 | parent->Close(); | 48 | m_parent->Close(); |
| 54 | } | 49 | } |
| 55 | 50 | ||
| 56 | bool KClientPort::IsSignaled() const { | 51 | bool KClientPort::IsSignaled() const { |
| 57 | return num_sessions < max_sessions; | 52 | return m_num_sessions.load() < m_max_sessions; |
| 58 | } | 53 | } |
| 59 | 54 | ||
| 60 | Result KClientPort::CreateSession(KClientSession** out) { | 55 | Result KClientPort::CreateSession(KClientSession** out) { |
| 56 | // Declare the session we're going to allocate. | ||
| 57 | KSession* session{}; | ||
| 58 | |||
| 61 | // Reserve a new session from the resource limit. | 59 | // Reserve a new session from the resource limit. |
| 62 | //! FIXME: we are reserving this from the wrong resource limit! | 60 | //! FIXME: we are reserving this from the wrong resource limit! |
| 63 | KScopedResourceReservation session_reservation(kernel.ApplicationProcess()->GetResourceLimit(), | 61 | KScopedResourceReservation session_reservation(kernel.ApplicationProcess()->GetResourceLimit(), |
| 64 | LimitableResource::SessionCountMax); | 62 | LimitableResource::SessionCountMax); |
| 65 | R_UNLESS(session_reservation.Succeeded(), ResultLimitReached); | 63 | R_UNLESS(session_reservation.Succeeded(), ResultLimitReached); |
| 66 | 64 | ||
| 65 | // Allocate a session normally. | ||
| 66 | session = KSession::Create(kernel); | ||
| 67 | |||
| 68 | // Check that we successfully created a session. | ||
| 69 | R_UNLESS(session != nullptr, ResultOutOfResource); | ||
| 70 | |||
| 67 | // Update the session counts. | 71 | // Update the session counts. |
| 68 | { | 72 | { |
| 73 | ON_RESULT_FAILURE { | ||
| 74 | session->Close(); | ||
| 75 | }; | ||
| 76 | |||
| 69 | // Atomically increment the number of sessions. | 77 | // Atomically increment the number of sessions. |
| 70 | s32 new_sessions{}; | 78 | s32 new_sessions{}; |
| 71 | { | 79 | { |
| 72 | const auto max = max_sessions; | 80 | const auto max = m_max_sessions; |
| 73 | auto cur_sessions = num_sessions.load(std::memory_order_acquire); | 81 | auto cur_sessions = m_num_sessions.load(std::memory_order_acquire); |
| 74 | do { | 82 | do { |
| 75 | R_UNLESS(cur_sessions < max, ResultOutOfSessions); | 83 | R_UNLESS(cur_sessions < max, ResultOutOfSessions); |
| 76 | new_sessions = cur_sessions + 1; | 84 | new_sessions = cur_sessions + 1; |
| 77 | } while (!num_sessions.compare_exchange_weak(cur_sessions, new_sessions, | 85 | } while (!m_num_sessions.compare_exchange_weak(cur_sessions, new_sessions, |
| 78 | std::memory_order_relaxed)); | 86 | std::memory_order_relaxed)); |
| 79 | } | 87 | } |
| 80 | 88 | ||
| 81 | // Atomically update the peak session tracking. | 89 | // Atomically update the peak session tracking. |
| 82 | { | 90 | { |
| 83 | auto peak = peak_sessions.load(std::memory_order_acquire); | 91 | auto peak = m_peak_sessions.load(std::memory_order_acquire); |
| 84 | do { | 92 | do { |
| 85 | if (peak >= new_sessions) { | 93 | if (peak >= new_sessions) { |
| 86 | break; | 94 | break; |
| 87 | } | 95 | } |
| 88 | } while (!peak_sessions.compare_exchange_weak(peak, new_sessions, | 96 | } while (!m_peak_sessions.compare_exchange_weak(peak, new_sessions, |
| 89 | std::memory_order_relaxed)); | 97 | std::memory_order_relaxed)); |
| 90 | } | 98 | } |
| 91 | } | 99 | } |
| 92 | 100 | ||
| 93 | // Create a new session. | ||
| 94 | KSession* session = KSession::Create(kernel); | ||
| 95 | if (session == nullptr) { | ||
| 96 | // Decrement the session count. | ||
| 97 | const auto prev = num_sessions--; | ||
| 98 | if (prev == max_sessions) { | ||
| 99 | this->NotifyAvailable(); | ||
| 100 | } | ||
| 101 | |||
| 102 | return ResultOutOfResource; | ||
| 103 | } | ||
| 104 | |||
| 105 | // Initialize the session. | 101 | // Initialize the session. |
| 106 | session->Initialize(this, parent->GetName()); | 102 | session->Initialize(this, m_parent->GetName()); |
| 107 | 103 | ||
| 108 | // Commit the session reservation. | 104 | // Commit the session reservation. |
| 109 | session_reservation.Commit(); | 105 | session_reservation.Commit(); |
| 110 | 106 | ||
| 111 | // Register the session. | 107 | // Register the session. |
| 112 | KSession::Register(kernel, session); | 108 | KSession::Register(kernel, session); |
| 113 | auto session_guard = SCOPE_GUARD({ | 109 | ON_RESULT_FAILURE { |
| 114 | session->GetClientSession().Close(); | 110 | session->GetClientSession().Close(); |
| 115 | session->GetServerSession().Close(); | 111 | session->GetServerSession().Close(); |
| 116 | }); | 112 | }; |
| 117 | 113 | ||
| 118 | // Enqueue the session with our parent. | 114 | // Enqueue the session with our parent. |
| 119 | R_TRY(parent->EnqueueSession(std::addressof(session->GetServerSession()))); | 115 | R_TRY(m_parent->EnqueueSession(std::addressof(session->GetServerSession()))); |
| 120 | 116 | ||
| 121 | // We succeeded, so set the output. | 117 | // We succeeded, so set the output. |
| 122 | session_guard.Cancel(); | ||
| 123 | *out = std::addressof(session->GetClientSession()); | 118 | *out = std::addressof(session->GetClientSession()); |
| 124 | return ResultSuccess; | 119 | R_SUCCEED(); |
| 125 | } | 120 | } |
| 126 | 121 | ||
| 127 | } // namespace Kernel | 122 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_client_port.h b/src/core/hle/kernel/k_client_port.h index a757cf9cd..23db06ddf 100644 --- a/src/core/hle/kernel/k_client_port.h +++ b/src/core/hle/kernel/k_client_port.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include <memory> | 6 | #include <memory> |
| 7 | #include <string> | ||
| 8 | 7 | ||
| 9 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 10 | #include "core/hle/kernel/k_synchronization_object.h" | 9 | #include "core/hle/kernel/k_synchronization_object.h" |
| @@ -20,28 +19,28 @@ class KClientPort final : public KSynchronizationObject { | |||
| 20 | KERNEL_AUTOOBJECT_TRAITS(KClientPort, KSynchronizationObject); | 19 | KERNEL_AUTOOBJECT_TRAITS(KClientPort, KSynchronizationObject); |
| 21 | 20 | ||
| 22 | public: | 21 | public: |
| 23 | explicit KClientPort(KernelCore& kernel_); | 22 | explicit KClientPort(KernelCore& kernel); |
| 24 | ~KClientPort() override; | 23 | ~KClientPort() override; |
| 25 | 24 | ||
| 26 | void Initialize(KPort* parent_, s32 max_sessions_, std::string&& name_); | 25 | void Initialize(KPort* parent, s32 max_sessions); |
| 27 | void OnSessionFinalized(); | 26 | void OnSessionFinalized(); |
| 28 | void OnServerClosed(); | 27 | void OnServerClosed(); |
| 29 | 28 | ||
| 30 | const KPort* GetParent() const { | 29 | const KPort* GetParent() const { |
| 31 | return parent; | 30 | return m_parent; |
| 32 | } | 31 | } |
| 33 | KPort* GetParent() { | 32 | KPort* GetParent() { |
| 34 | return parent; | 33 | return m_parent; |
| 35 | } | 34 | } |
| 36 | 35 | ||
| 37 | s32 GetNumSessions() const { | 36 | s32 GetNumSessions() const { |
| 38 | return num_sessions; | 37 | return m_num_sessions; |
| 39 | } | 38 | } |
| 40 | s32 GetPeakSessions() const { | 39 | s32 GetPeakSessions() const { |
| 41 | return peak_sessions; | 40 | return m_peak_sessions; |
| 42 | } | 41 | } |
| 43 | s32 GetMaxSessions() const { | 42 | s32 GetMaxSessions() const { |
| 44 | return max_sessions; | 43 | return m_max_sessions; |
| 45 | } | 44 | } |
| 46 | 45 | ||
| 47 | bool IsLight() const; | 46 | bool IsLight() const; |
| @@ -54,10 +53,10 @@ public: | |||
| 54 | Result CreateSession(KClientSession** out); | 53 | Result CreateSession(KClientSession** out); |
| 55 | 54 | ||
| 56 | private: | 55 | private: |
| 57 | std::atomic<s32> num_sessions{}; | 56 | std::atomic<s32> m_num_sessions{}; |
| 58 | std::atomic<s32> peak_sessions{}; | 57 | std::atomic<s32> m_peak_sessions{}; |
| 59 | s32 max_sessions{}; | 58 | s32 m_max_sessions{}; |
| 60 | KPort* parent{}; | 59 | KPort* m_parent{}; |
| 61 | }; | 60 | }; |
| 62 | 61 | ||
| 63 | } // namespace Kernel | 62 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_client_session.cpp b/src/core/hle/kernel/k_client_session.cpp index da0c9ac8c..c9196d04b 100644 --- a/src/core/hle/kernel/k_client_session.cpp +++ b/src/core/hle/kernel/k_client_session.cpp | |||
| @@ -17,8 +17,8 @@ KClientSession::KClientSession(KernelCore& kernel_) | |||
| 17 | KClientSession::~KClientSession() = default; | 17 | KClientSession::~KClientSession() = default; |
| 18 | 18 | ||
| 19 | void KClientSession::Destroy() { | 19 | void KClientSession::Destroy() { |
| 20 | parent->OnClientClosed(); | 20 | m_parent->OnClientClosed(); |
| 21 | parent->Close(); | 21 | m_parent->Close(); |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | void KClientSession::OnServerClosed() {} | 24 | void KClientSession::OnServerClosed() {} |
| @@ -33,7 +33,7 @@ Result KClientSession::SendSyncRequest() { | |||
| 33 | request->Initialize(nullptr, GetCurrentThread(kernel).GetTLSAddress(), MessageBufferSize); | 33 | request->Initialize(nullptr, GetCurrentThread(kernel).GetTLSAddress(), MessageBufferSize); |
| 34 | 34 | ||
| 35 | // Send the request. | 35 | // Send the request. |
| 36 | return parent->GetServerSession().OnRequest(request); | 36 | R_RETURN(m_parent->GetServerSession().OnRequest(request)); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | } // namespace Kernel | 39 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_client_session.h b/src/core/hle/kernel/k_client_session.h index b4a19c546..ecde2549c 100644 --- a/src/core/hle/kernel/k_client_session.h +++ b/src/core/hle/kernel/k_client_session.h | |||
| @@ -33,17 +33,16 @@ public: | |||
| 33 | explicit KClientSession(KernelCore& kernel_); | 33 | explicit KClientSession(KernelCore& kernel_); |
| 34 | ~KClientSession() override; | 34 | ~KClientSession() override; |
| 35 | 35 | ||
| 36 | void Initialize(KSession* parent_session_, std::string&& name_) { | 36 | void Initialize(KSession* parent) { |
| 37 | // Set member variables. | 37 | // Set member variables. |
| 38 | parent = parent_session_; | 38 | m_parent = parent; |
| 39 | name = std::move(name_); | ||
| 40 | } | 39 | } |
| 41 | 40 | ||
| 42 | void Destroy() override; | 41 | void Destroy() override; |
| 43 | static void PostDestroy([[maybe_unused]] uintptr_t arg) {} | 42 | static void PostDestroy(uintptr_t arg) {} |
| 44 | 43 | ||
| 45 | KSession* GetParent() const { | 44 | KSession* GetParent() const { |
| 46 | return parent; | 45 | return m_parent; |
| 47 | } | 46 | } |
| 48 | 47 | ||
| 49 | Result SendSyncRequest(); | 48 | Result SendSyncRequest(); |
| @@ -51,7 +50,7 @@ public: | |||
| 51 | void OnServerClosed(); | 50 | void OnServerClosed(); |
| 52 | 51 | ||
| 53 | private: | 52 | private: |
| 54 | KSession* parent{}; | 53 | KSession* m_parent{}; |
| 55 | }; | 54 | }; |
| 56 | 55 | ||
| 57 | } // namespace Kernel | 56 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_port.cpp b/src/core/hle/kernel/k_port.cpp index 0a45ffd57..f73bc34d4 100644 --- a/src/core/hle/kernel/k_port.cpp +++ b/src/core/hle/kernel/k_port.cpp | |||
| @@ -8,55 +8,54 @@ | |||
| 8 | namespace Kernel { | 8 | namespace Kernel { |
| 9 | 9 | ||
| 10 | KPort::KPort(KernelCore& kernel_) | 10 | KPort::KPort(KernelCore& kernel_) |
| 11 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, server{kernel_}, client{kernel_} {} | 11 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, m_server{kernel_}, m_client{kernel_} {} |
| 12 | 12 | ||
| 13 | KPort::~KPort() = default; | 13 | KPort::~KPort() = default; |
| 14 | 14 | ||
| 15 | void KPort::Initialize(s32 max_sessions_, bool is_light_, const std::string& name_) { | 15 | void KPort::Initialize(s32 max_sessions, bool is_light, uintptr_t name) { |
| 16 | // Open a new reference count to the initialized port. | 16 | // Open a new reference count to the initialized port. |
| 17 | Open(); | 17 | this->Open(); |
| 18 | 18 | ||
| 19 | // Create and initialize our server/client pair. | 19 | // Create and initialize our server/client pair. |
| 20 | KAutoObject::Create(std::addressof(server)); | 20 | KAutoObject::Create(std::addressof(m_server)); |
| 21 | KAutoObject::Create(std::addressof(client)); | 21 | KAutoObject::Create(std::addressof(m_client)); |
| 22 | server.Initialize(this, name_ + ":Server"); | 22 | m_server.Initialize(this); |
| 23 | client.Initialize(this, max_sessions_, name_ + ":Client"); | 23 | m_client.Initialize(this, max_sessions); |
| 24 | 24 | ||
| 25 | // Set our member variables. | 25 | // Set our member variables. |
| 26 | is_light = is_light_; | 26 | m_is_light = is_light; |
| 27 | name = name_; | 27 | m_name = name; |
| 28 | state = State::Normal; | 28 | m_state = State::Normal; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | void KPort::OnClientClosed() { | 31 | void KPort::OnClientClosed() { |
| 32 | KScopedSchedulerLock sl{kernel}; | 32 | KScopedSchedulerLock sl{kernel}; |
| 33 | 33 | ||
| 34 | if (state == State::Normal) { | 34 | if (m_state == State::Normal) { |
| 35 | state = State::ClientClosed; | 35 | m_state = State::ClientClosed; |
| 36 | } | 36 | } |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | void KPort::OnServerClosed() { | 39 | void KPort::OnServerClosed() { |
| 40 | KScopedSchedulerLock sl{kernel}; | 40 | KScopedSchedulerLock sl{kernel}; |
| 41 | 41 | ||
| 42 | if (state == State::Normal) { | 42 | if (m_state == State::Normal) { |
| 43 | state = State::ServerClosed; | 43 | m_state = State::ServerClosed; |
| 44 | } | 44 | } |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | bool KPort::IsServerClosed() const { | 47 | bool KPort::IsServerClosed() const { |
| 48 | KScopedSchedulerLock sl{kernel}; | 48 | KScopedSchedulerLock sl{kernel}; |
| 49 | return state == State::ServerClosed; | 49 | return m_state == State::ServerClosed; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | Result KPort::EnqueueSession(KServerSession* session) { | 52 | Result KPort::EnqueueSession(KServerSession* session) { |
| 53 | KScopedSchedulerLock sl{kernel}; | 53 | KScopedSchedulerLock sl{kernel}; |
| 54 | 54 | ||
| 55 | R_UNLESS(state == State::Normal, ResultPortClosed); | 55 | R_UNLESS(m_state == State::Normal, ResultPortClosed); |
| 56 | 56 | ||
| 57 | server.EnqueueSession(session); | 57 | m_server.EnqueueSession(session); |
| 58 | 58 | R_SUCCEED(); | |
| 59 | return ResultSuccess; | ||
| 60 | } | 59 | } |
| 61 | 60 | ||
| 62 | } // namespace Kernel | 61 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_port.h b/src/core/hle/kernel/k_port.h index 0cfc16dab..f2a08547c 100644 --- a/src/core/hle/kernel/k_port.h +++ b/src/core/hle/kernel/k_port.h | |||
| @@ -22,14 +22,17 @@ public: | |||
| 22 | explicit KPort(KernelCore& kernel_); | 22 | explicit KPort(KernelCore& kernel_); |
| 23 | ~KPort() override; | 23 | ~KPort() override; |
| 24 | 24 | ||
| 25 | static void PostDestroy([[maybe_unused]] uintptr_t arg) {} | 25 | static void PostDestroy(uintptr_t arg) {} |
| 26 | 26 | ||
| 27 | void Initialize(s32 max_sessions_, bool is_light_, const std::string& name_); | 27 | void Initialize(s32 max_sessions, bool is_light, uintptr_t name); |
| 28 | void OnClientClosed(); | 28 | void OnClientClosed(); |
| 29 | void OnServerClosed(); | 29 | void OnServerClosed(); |
| 30 | 30 | ||
| 31 | uintptr_t GetName() const { | ||
| 32 | return m_name; | ||
| 33 | } | ||
| 31 | bool IsLight() const { | 34 | bool IsLight() const { |
| 32 | return is_light; | 35 | return m_is_light; |
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | bool IsServerClosed() const; | 38 | bool IsServerClosed() const; |
| @@ -37,16 +40,16 @@ public: | |||
| 37 | Result EnqueueSession(KServerSession* session); | 40 | Result EnqueueSession(KServerSession* session); |
| 38 | 41 | ||
| 39 | KClientPort& GetClientPort() { | 42 | KClientPort& GetClientPort() { |
| 40 | return client; | 43 | return m_client; |
| 41 | } | 44 | } |
| 42 | KServerPort& GetServerPort() { | 45 | KServerPort& GetServerPort() { |
| 43 | return server; | 46 | return m_server; |
| 44 | } | 47 | } |
| 45 | const KClientPort& GetClientPort() const { | 48 | const KClientPort& GetClientPort() const { |
| 46 | return client; | 49 | return m_client; |
| 47 | } | 50 | } |
| 48 | const KServerPort& GetServerPort() const { | 51 | const KServerPort& GetServerPort() const { |
| 49 | return server; | 52 | return m_server; |
| 50 | } | 53 | } |
| 51 | 54 | ||
| 52 | private: | 55 | private: |
| @@ -57,10 +60,11 @@ private: | |||
| 57 | ServerClosed = 3, | 60 | ServerClosed = 3, |
| 58 | }; | 61 | }; |
| 59 | 62 | ||
| 60 | KServerPort server; | 63 | KServerPort m_server; |
| 61 | KClientPort client; | 64 | KClientPort m_client; |
| 62 | State state{State::Invalid}; | 65 | uintptr_t m_name; |
| 63 | bool is_light{}; | 66 | State m_state{State::Invalid}; |
| 67 | bool m_is_light{}; | ||
| 64 | }; | 68 | }; |
| 65 | 69 | ||
| 66 | } // namespace Kernel | 70 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index bd9b9f876..8d65be17a 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h | |||
| @@ -395,6 +395,10 @@ public: | |||
| 395 | return watchpoints; | 395 | return watchpoints; |
| 396 | } | 396 | } |
| 397 | 397 | ||
| 398 | const std::string& GetName() { | ||
| 399 | return name; | ||
| 400 | } | ||
| 401 | |||
| 398 | private: | 402 | private: |
| 399 | void PinThread(s32 core_id, KThread* thread) { | 403 | void PinThread(s32 core_id, KThread* thread) { |
| 400 | ASSERT(0 <= core_id && core_id < static_cast<s32>(Core::Hardware::NUM_CPU_CORES)); | 404 | ASSERT(0 <= core_id && core_id < static_cast<s32>(Core::Hardware::NUM_CPU_CORES)); |
| @@ -499,6 +503,8 @@ private: | |||
| 499 | 503 | ||
| 500 | size_t memory_release_hint{}; | 504 | size_t memory_release_hint{}; |
| 501 | 505 | ||
| 506 | std::string name{}; | ||
| 507 | |||
| 502 | bool is_signaled{}; | 508 | bool is_signaled{}; |
| 503 | bool is_suspended{}; | 509 | bool is_suspended{}; |
| 504 | bool is_immortal{}; | 510 | bool is_immortal{}; |
diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp index 16968ba97..dc70ee848 100644 --- a/src/core/hle/kernel/k_server_port.cpp +++ b/src/core/hle/kernel/k_server_port.cpp | |||
| @@ -15,10 +15,9 @@ namespace Kernel { | |||
| 15 | KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} | 15 | KServerPort::KServerPort(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} |
| 16 | KServerPort::~KServerPort() = default; | 16 | KServerPort::~KServerPort() = default; |
| 17 | 17 | ||
| 18 | void KServerPort::Initialize(KPort* parent_port_, std::string&& name_) { | 18 | void KServerPort::Initialize(KPort* parent) { |
| 19 | // Set member variables. | 19 | // Set member variables. |
| 20 | parent = parent_port_; | 20 | m_parent = parent; |
| 21 | name = std::move(name_); | ||
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | bool KServerPort::IsLight() const { | 23 | bool KServerPort::IsLight() const { |
| @@ -37,9 +36,9 @@ void KServerPort::CleanupSessions() { | |||
| 37 | KServerSession* session = nullptr; | 36 | KServerSession* session = nullptr; |
| 38 | { | 37 | { |
| 39 | KScopedSchedulerLock sl{kernel}; | 38 | KScopedSchedulerLock sl{kernel}; |
| 40 | if (!session_list.empty()) { | 39 | if (!m_session_list.empty()) { |
| 41 | session = std::addressof(session_list.front()); | 40 | session = std::addressof(m_session_list.front()); |
| 42 | session_list.pop_front(); | 41 | m_session_list.pop_front(); |
| 43 | } | 42 | } |
| 44 | } | 43 | } |
| 45 | 44 | ||
| @@ -54,13 +53,13 @@ void KServerPort::CleanupSessions() { | |||
| 54 | 53 | ||
| 55 | void KServerPort::Destroy() { | 54 | void KServerPort::Destroy() { |
| 56 | // Note with our parent that we're closed. | 55 | // Note with our parent that we're closed. |
| 57 | parent->OnServerClosed(); | 56 | m_parent->OnServerClosed(); |
| 58 | 57 | ||
| 59 | // Perform necessary cleanup of our session lists. | 58 | // Perform necessary cleanup of our session lists. |
| 60 | this->CleanupSessions(); | 59 | this->CleanupSessions(); |
| 61 | 60 | ||
| 62 | // Close our reference to our parent. | 61 | // Close our reference to our parent. |
| 63 | parent->Close(); | 62 | m_parent->Close(); |
| 64 | } | 63 | } |
| 65 | 64 | ||
| 66 | bool KServerPort::IsSignaled() const { | 65 | bool KServerPort::IsSignaled() const { |
| @@ -68,7 +67,7 @@ bool KServerPort::IsSignaled() const { | |||
| 68 | UNIMPLEMENTED(); | 67 | UNIMPLEMENTED(); |
| 69 | return false; | 68 | return false; |
| 70 | } else { | 69 | } else { |
| 71 | return !session_list.empty(); | 70 | return !m_session_list.empty(); |
| 72 | } | 71 | } |
| 73 | } | 72 | } |
| 74 | 73 | ||
| @@ -78,8 +77,8 @@ void KServerPort::EnqueueSession(KServerSession* session) { | |||
| 78 | KScopedSchedulerLock sl{kernel}; | 77 | KScopedSchedulerLock sl{kernel}; |
| 79 | 78 | ||
| 80 | // Add the session to our queue. | 79 | // Add the session to our queue. |
| 81 | session_list.push_back(*session); | 80 | m_session_list.push_back(*session); |
| 82 | if (session_list.size() == 1) { | 81 | if (m_session_list.size() == 1) { |
| 83 | this->NotifyAvailable(); | 82 | this->NotifyAvailable(); |
| 84 | } | 83 | } |
| 85 | } | 84 | } |
| @@ -90,12 +89,12 @@ KServerSession* KServerPort::AcceptSession() { | |||
| 90 | KScopedSchedulerLock sl{kernel}; | 89 | KScopedSchedulerLock sl{kernel}; |
| 91 | 90 | ||
| 92 | // Return the first session in the list. | 91 | // Return the first session in the list. |
| 93 | if (session_list.empty()) { | 92 | if (m_session_list.empty()) { |
| 94 | return nullptr; | 93 | return nullptr; |
| 95 | } | 94 | } |
| 96 | 95 | ||
| 97 | KServerSession* session = std::addressof(session_list.front()); | 96 | KServerSession* session = std::addressof(m_session_list.front()); |
| 98 | session_list.pop_front(); | 97 | m_session_list.pop_front(); |
| 99 | return session; | 98 | return session; |
| 100 | } | 99 | } |
| 101 | 100 | ||
diff --git a/src/core/hle/kernel/k_server_port.h b/src/core/hle/kernel/k_server_port.h index 5fc7ee683..964767156 100644 --- a/src/core/hle/kernel/k_server_port.h +++ b/src/core/hle/kernel/k_server_port.h | |||
| @@ -25,14 +25,14 @@ public: | |||
| 25 | explicit KServerPort(KernelCore& kernel_); | 25 | explicit KServerPort(KernelCore& kernel_); |
| 26 | ~KServerPort() override; | 26 | ~KServerPort() override; |
| 27 | 27 | ||
| 28 | void Initialize(KPort* parent_port_, std::string&& name_); | 28 | void Initialize(KPort* parent); |
| 29 | 29 | ||
| 30 | void EnqueueSession(KServerSession* pending_session); | 30 | void EnqueueSession(KServerSession* session); |
| 31 | 31 | ||
| 32 | KServerSession* AcceptSession(); | 32 | KServerSession* AcceptSession(); |
| 33 | 33 | ||
| 34 | const KPort* GetParent() const { | 34 | const KPort* GetParent() const { |
| 35 | return parent; | 35 | return m_parent; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | bool IsLight() const; | 38 | bool IsLight() const; |
| @@ -46,8 +46,8 @@ private: | |||
| 46 | 46 | ||
| 47 | void CleanupSessions(); | 47 | void CleanupSessions(); |
| 48 | 48 | ||
| 49 | SessionList session_list; | 49 | SessionList m_session_list{}; |
| 50 | KPort* parent{}; | 50 | KPort* m_parent{}; |
| 51 | }; | 51 | }; |
| 52 | 52 | ||
| 53 | } // namespace Kernel | 53 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 01591af5b..6831243b5 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -33,18 +33,12 @@ KServerSession::KServerSession(KernelCore& kernel_) | |||
| 33 | 33 | ||
| 34 | KServerSession::~KServerSession() = default; | 34 | KServerSession::~KServerSession() = default; |
| 35 | 35 | ||
| 36 | void KServerSession::Initialize(KSession* parent_session_, std::string&& name_) { | ||
| 37 | // Set member variables. | ||
| 38 | parent = parent_session_; | ||
| 39 | name = std::move(name_); | ||
| 40 | } | ||
| 41 | |||
| 42 | void KServerSession::Destroy() { | 36 | void KServerSession::Destroy() { |
| 43 | parent->OnServerClosed(); | 37 | m_parent->OnServerClosed(); |
| 44 | 38 | ||
| 45 | this->CleanupRequests(); | 39 | this->CleanupRequests(); |
| 46 | 40 | ||
| 47 | parent->Close(); | 41 | m_parent->Close(); |
| 48 | } | 42 | } |
| 49 | 43 | ||
| 50 | void KServerSession::OnClientClosed() { | 44 | void KServerSession::OnClientClosed() { |
| @@ -144,7 +138,7 @@ bool KServerSession::IsSignaled() const { | |||
| 144 | ASSERT(KScheduler::IsSchedulerLockedByCurrentThread(kernel)); | 138 | ASSERT(KScheduler::IsSchedulerLockedByCurrentThread(kernel)); |
| 145 | 139 | ||
| 146 | // If the client is closed, we're always signaled. | 140 | // If the client is closed, we're always signaled. |
| 147 | if (parent->IsClientClosed()) { | 141 | if (m_parent->IsClientClosed()) { |
| 148 | return true; | 142 | return true; |
| 149 | } | 143 | } |
| 150 | 144 | ||
| @@ -161,7 +155,7 @@ Result KServerSession::OnRequest(KSessionRequest* request) { | |||
| 161 | KScopedSchedulerLock sl{kernel}; | 155 | KScopedSchedulerLock sl{kernel}; |
| 162 | 156 | ||
| 163 | // Ensure that we can handle new requests. | 157 | // Ensure that we can handle new requests. |
| 164 | R_UNLESS(!parent->IsServerClosed(), ResultSessionClosed); | 158 | R_UNLESS(!m_parent->IsServerClosed(), ResultSessionClosed); |
| 165 | 159 | ||
| 166 | // Check that we're not terminating. | 160 | // Check that we're not terminating. |
| 167 | R_UNLESS(!GetCurrentThread(kernel).IsTerminationRequested(), ResultTerminationRequested); | 161 | R_UNLESS(!GetCurrentThread(kernel).IsTerminationRequested(), ResultTerminationRequested); |
| @@ -219,7 +213,7 @@ Result KServerSession::SendReply(bool is_hle) { | |||
| 219 | KEvent* event = request->GetEvent(); | 213 | KEvent* event = request->GetEvent(); |
| 220 | 214 | ||
| 221 | // Check whether we're closed. | 215 | // Check whether we're closed. |
| 222 | const bool closed = (client_thread == nullptr || parent->IsClientClosed()); | 216 | const bool closed = (client_thread == nullptr || m_parent->IsClientClosed()); |
| 223 | 217 | ||
| 224 | Result result = ResultSuccess; | 218 | Result result = ResultSuccess; |
| 225 | if (!closed) { | 219 | if (!closed) { |
| @@ -294,7 +288,7 @@ Result KServerSession::ReceiveRequest(std::shared_ptr<Service::HLERequestContext | |||
| 294 | KScopedSchedulerLock sl{kernel}; | 288 | KScopedSchedulerLock sl{kernel}; |
| 295 | 289 | ||
| 296 | // Ensure that we can service the request. | 290 | // Ensure that we can service the request. |
| 297 | R_UNLESS(!parent->IsClientClosed(), ResultSessionClosed); | 291 | R_UNLESS(!m_parent->IsClientClosed(), ResultSessionClosed); |
| 298 | 292 | ||
| 299 | // Ensure we aren't already servicing a request. | 293 | // Ensure we aren't already servicing a request. |
| 300 | R_UNLESS(m_current_request == nullptr, ResultNotFound); | 294 | R_UNLESS(m_current_request == nullptr, ResultNotFound); |
diff --git a/src/core/hle/kernel/k_server_session.h b/src/core/hle/kernel/k_server_session.h index 33f380352..e340e4dd8 100644 --- a/src/core/hle/kernel/k_server_session.h +++ b/src/core/hle/kernel/k_server_session.h | |||
| @@ -38,14 +38,12 @@ public: | |||
| 38 | 38 | ||
| 39 | void Destroy() override; | 39 | void Destroy() override; |
| 40 | 40 | ||
| 41 | void Initialize(KSession* parent_session_, std::string&& name_); | 41 | void Initialize(KSession* p) { |
| 42 | 42 | m_parent = p; | |
| 43 | KSession* GetParent() { | ||
| 44 | return parent; | ||
| 45 | } | 43 | } |
| 46 | 44 | ||
| 47 | const KSession* GetParent() const { | 45 | const KSession* GetParent() const { |
| 48 | return parent; | 46 | return m_parent; |
| 49 | } | 47 | } |
| 50 | 48 | ||
| 51 | bool IsSignaled() const override; | 49 | bool IsSignaled() const override; |
| @@ -66,10 +64,10 @@ private: | |||
| 66 | void CleanupRequests(); | 64 | void CleanupRequests(); |
| 67 | 65 | ||
| 68 | /// KSession that owns this KServerSession | 66 | /// KSession that owns this KServerSession |
| 69 | KSession* parent{}; | 67 | KSession* m_parent{}; |
| 70 | 68 | ||
| 71 | /// List of threads which are pending a reply. | 69 | /// List of threads which are pending a reply. |
| 72 | boost::intrusive::list<KSessionRequest> m_request_list; | 70 | boost::intrusive::list<KSessionRequest> m_request_list{}; |
| 73 | KSessionRequest* m_current_request{}; | 71 | KSessionRequest* m_current_request{}; |
| 74 | 72 | ||
| 75 | KLightLock m_lock; | 73 | KLightLock m_lock; |
diff --git a/src/core/hle/kernel/k_session.cpp b/src/core/hle/kernel/k_session.cpp index 7e677c028..771ad68bf 100644 --- a/src/core/hle/kernel/k_session.cpp +++ b/src/core/hle/kernel/k_session.cpp | |||
| @@ -10,68 +10,62 @@ | |||
| 10 | namespace Kernel { | 10 | namespace Kernel { |
| 11 | 11 | ||
| 12 | KSession::KSession(KernelCore& kernel_) | 12 | KSession::KSession(KernelCore& kernel_) |
| 13 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, server{kernel_}, client{kernel_} {} | 13 | : KAutoObjectWithSlabHeapAndContainer{kernel_}, m_server{kernel_}, m_client{kernel_} {} |
| 14 | KSession::~KSession() = default; | 14 | KSession::~KSession() = default; |
| 15 | 15 | ||
| 16 | void KSession::Initialize(KClientPort* port_, const std::string& name_) { | 16 | void KSession::Initialize(KClientPort* client_port, uintptr_t name) { |
| 17 | // Increment reference count. | 17 | // Increment reference count. |
| 18 | // Because reference count is one on creation, this will result | 18 | // Because reference count is one on creation, this will result |
| 19 | // in a reference count of two. Thus, when both server and client are closed | 19 | // in a reference count of two. Thus, when both server and client are closed |
| 20 | // this object will be destroyed. | 20 | // this object will be destroyed. |
| 21 | Open(); | 21 | this->Open(); |
| 22 | 22 | ||
| 23 | // Create our sub sessions. | 23 | // Create our sub sessions. |
| 24 | KAutoObject::Create(std::addressof(server)); | 24 | KAutoObject::Create(std::addressof(m_server)); |
| 25 | KAutoObject::Create(std::addressof(client)); | 25 | KAutoObject::Create(std::addressof(m_client)); |
| 26 | 26 | ||
| 27 | // Initialize our sub sessions. | 27 | // Initialize our sub sessions. |
| 28 | server.Initialize(this, name_ + ":Server"); | 28 | m_server.Initialize(this); |
| 29 | client.Initialize(this, name_ + ":Client"); | 29 | m_client.Initialize(this); |
| 30 | 30 | ||
| 31 | // Set state and name. | 31 | // Set state and name. |
| 32 | SetState(State::Normal); | 32 | this->SetState(State::Normal); |
| 33 | name = name_; | 33 | m_name = name; |
| 34 | 34 | ||
| 35 | // Set our owner process. | 35 | // Set our owner process. |
| 36 | //! FIXME: this is the wrong process! | 36 | //! FIXME: this is the wrong process! |
| 37 | process = kernel.ApplicationProcess(); | 37 | m_process = kernel.ApplicationProcess(); |
| 38 | process->Open(); | 38 | m_process->Open(); |
| 39 | 39 | ||
| 40 | // Set our port. | 40 | // Set our port. |
| 41 | port = port_; | 41 | m_port = client_port; |
| 42 | if (port != nullptr) { | 42 | if (m_port != nullptr) { |
| 43 | port->Open(); | 43 | m_port->Open(); |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | // Mark initialized. | 46 | // Mark initialized. |
| 47 | initialized = true; | 47 | m_initialized = true; |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | void KSession::Finalize() { | 50 | void KSession::Finalize() { |
| 51 | if (port == nullptr) { | 51 | if (m_port != nullptr) { |
| 52 | return; | 52 | m_port->OnSessionFinalized(); |
| 53 | m_port->Close(); | ||
| 53 | } | 54 | } |
| 54 | |||
| 55 | port->OnSessionFinalized(); | ||
| 56 | port->Close(); | ||
| 57 | } | 55 | } |
| 58 | 56 | ||
| 59 | void KSession::OnServerClosed() { | 57 | void KSession::OnServerClosed() { |
| 60 | if (GetState() != State::Normal) { | 58 | if (this->GetState() == State::Normal) { |
| 61 | return; | 59 | this->SetState(State::ServerClosed); |
| 60 | m_client.OnServerClosed(); | ||
| 62 | } | 61 | } |
| 63 | |||
| 64 | SetState(State::ServerClosed); | ||
| 65 | client.OnServerClosed(); | ||
| 66 | } | 62 | } |
| 67 | 63 | ||
| 68 | void KSession::OnClientClosed() { | 64 | void KSession::OnClientClosed() { |
| 69 | if (GetState() != State::Normal) { | 65 | if (this->GetState() == State::Normal) { |
| 70 | return; | 66 | SetState(State::ClientClosed); |
| 67 | m_server.OnClientClosed(); | ||
| 71 | } | 68 | } |
| 72 | |||
| 73 | SetState(State::ClientClosed); | ||
| 74 | server.OnClientClosed(); | ||
| 75 | } | 69 | } |
| 76 | 70 | ||
| 77 | void KSession::PostDestroy(uintptr_t arg) { | 71 | void KSession::PostDestroy(uintptr_t arg) { |
diff --git a/src/core/hle/kernel/k_session.h b/src/core/hle/kernel/k_session.h index 93e5e6f71..ab553a04c 100644 --- a/src/core/hle/kernel/k_session.h +++ b/src/core/hle/kernel/k_session.h | |||
| @@ -21,16 +21,15 @@ public: | |||
| 21 | explicit KSession(KernelCore& kernel_); | 21 | explicit KSession(KernelCore& kernel_); |
| 22 | ~KSession() override; | 22 | ~KSession() override; |
| 23 | 23 | ||
| 24 | void Initialize(KClientPort* port_, const std::string& name_); | 24 | void Initialize(KClientPort* port, uintptr_t name); |
| 25 | |||
| 26 | void Finalize() override; | 25 | void Finalize() override; |
| 27 | 26 | ||
| 28 | bool IsInitialized() const override { | 27 | bool IsInitialized() const override { |
| 29 | return initialized; | 28 | return m_initialized; |
| 30 | } | 29 | } |
| 31 | 30 | ||
| 32 | uintptr_t GetPostDestroyArgument() const override { | 31 | uintptr_t GetPostDestroyArgument() const override { |
| 33 | return reinterpret_cast<uintptr_t>(process); | 32 | return reinterpret_cast<uintptr_t>(m_process); |
| 34 | } | 33 | } |
| 35 | 34 | ||
| 36 | static void PostDestroy(uintptr_t arg); | 35 | static void PostDestroy(uintptr_t arg); |
| @@ -48,27 +47,23 @@ public: | |||
| 48 | } | 47 | } |
| 49 | 48 | ||
| 50 | KClientSession& GetClientSession() { | 49 | KClientSession& GetClientSession() { |
| 51 | return client; | 50 | return m_client; |
| 52 | } | 51 | } |
| 53 | 52 | ||
| 54 | KServerSession& GetServerSession() { | 53 | KServerSession& GetServerSession() { |
| 55 | return server; | 54 | return m_server; |
| 56 | } | 55 | } |
| 57 | 56 | ||
| 58 | const KClientSession& GetClientSession() const { | 57 | const KClientSession& GetClientSession() const { |
| 59 | return client; | 58 | return m_client; |
| 60 | } | 59 | } |
| 61 | 60 | ||
| 62 | const KServerSession& GetServerSession() const { | 61 | const KServerSession& GetServerSession() const { |
| 63 | return server; | 62 | return m_server; |
| 64 | } | 63 | } |
| 65 | 64 | ||
| 66 | const KClientPort* GetParent() const { | 65 | const KClientPort* GetParent() const { |
| 67 | return port; | 66 | return m_port; |
| 68 | } | ||
| 69 | |||
| 70 | KClientPort* GetParent() { | ||
| 71 | return port; | ||
| 72 | } | 67 | } |
| 73 | 68 | ||
| 74 | private: | 69 | private: |
| @@ -80,20 +75,20 @@ private: | |||
| 80 | }; | 75 | }; |
| 81 | 76 | ||
| 82 | void SetState(State state) { | 77 | void SetState(State state) { |
| 83 | atomic_state = static_cast<u8>(state); | 78 | m_atomic_state = static_cast<u8>(state); |
| 84 | } | 79 | } |
| 85 | 80 | ||
| 86 | State GetState() const { | 81 | State GetState() const { |
| 87 | return static_cast<State>(atomic_state.load(std::memory_order_relaxed)); | 82 | return static_cast<State>(m_atomic_state.load()); |
| 88 | } | 83 | } |
| 89 | 84 | ||
| 90 | KServerSession server; | 85 | KServerSession m_server; |
| 91 | KClientSession client; | 86 | KClientSession m_client; |
| 92 | std::atomic<std::underlying_type_t<State>> atomic_state{ | 87 | KClientPort* m_port{}; |
| 93 | static_cast<std::underlying_type_t<State>>(State::Invalid)}; | 88 | uintptr_t m_name{}; |
| 94 | KClientPort* port{}; | 89 | KProcess* m_process{}; |
| 95 | KProcess* process{}; | 90 | std::atomic<u8> m_atomic_state{static_cast<u8>(State::Invalid)}; |
| 96 | bool initialized{}; | 91 | bool m_initialized{}; |
| 97 | }; | 92 | }; |
| 98 | 93 | ||
| 99 | } // namespace Kernel | 94 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_shared_memory.cpp b/src/core/hle/kernel/k_shared_memory.cpp index df505edfe..42cb7ac77 100644 --- a/src/core/hle/kernel/k_shared_memory.cpp +++ b/src/core/hle/kernel/k_shared_memory.cpp | |||
| @@ -17,15 +17,13 @@ KSharedMemory::~KSharedMemory() = default; | |||
| 17 | 17 | ||
| 18 | Result KSharedMemory::Initialize(Core::DeviceMemory& device_memory_, KProcess* owner_process_, | 18 | Result KSharedMemory::Initialize(Core::DeviceMemory& device_memory_, KProcess* owner_process_, |
| 19 | Svc::MemoryPermission owner_permission_, | 19 | Svc::MemoryPermission owner_permission_, |
| 20 | Svc::MemoryPermission user_permission_, std::size_t size_, | 20 | Svc::MemoryPermission user_permission_, std::size_t size_) { |
| 21 | std::string name_) { | ||
| 22 | // Set members. | 21 | // Set members. |
| 23 | owner_process = owner_process_; | 22 | owner_process = owner_process_; |
| 24 | device_memory = &device_memory_; | 23 | device_memory = &device_memory_; |
| 25 | owner_permission = owner_permission_; | 24 | owner_permission = owner_permission_; |
| 26 | user_permission = user_permission_; | 25 | user_permission = user_permission_; |
| 27 | size = Common::AlignUp(size_, PageSize); | 26 | size = Common::AlignUp(size_, PageSize); |
| 28 | name = std::move(name_); | ||
| 29 | 27 | ||
| 30 | const size_t num_pages = Common::DivideUp(size, PageSize); | 28 | const size_t num_pages = Common::DivideUp(size, PageSize); |
| 31 | 29 | ||
| @@ -64,7 +62,7 @@ Result KSharedMemory::Initialize(Core::DeviceMemory& device_memory_, KProcess* o | |||
| 64 | std::memset(device_memory_.GetPointer<void>(block.GetAddress()), 0, block.GetSize()); | 62 | std::memset(device_memory_.GetPointer<void>(block.GetAddress()), 0, block.GetSize()); |
| 65 | } | 63 | } |
| 66 | 64 | ||
| 67 | return ResultSuccess; | 65 | R_SUCCEED(); |
| 68 | } | 66 | } |
| 69 | 67 | ||
| 70 | void KSharedMemory::Finalize() { | 68 | void KSharedMemory::Finalize() { |
| @@ -94,15 +92,15 @@ Result KSharedMemory::Map(KProcess& target_process, VAddr address, std::size_t m | |||
| 94 | R_UNLESS(map_perm == test_perm, ResultInvalidNewMemoryPermission); | 92 | R_UNLESS(map_perm == test_perm, ResultInvalidNewMemoryPermission); |
| 95 | } | 93 | } |
| 96 | 94 | ||
| 97 | return target_process.PageTable().MapPageGroup(address, *page_group, KMemoryState::Shared, | 95 | R_RETURN(target_process.PageTable().MapPageGroup(address, *page_group, KMemoryState::Shared, |
| 98 | ConvertToKMemoryPermission(map_perm)); | 96 | ConvertToKMemoryPermission(map_perm))); |
| 99 | } | 97 | } |
| 100 | 98 | ||
| 101 | Result KSharedMemory::Unmap(KProcess& target_process, VAddr address, std::size_t unmap_size) { | 99 | Result KSharedMemory::Unmap(KProcess& target_process, VAddr address, std::size_t unmap_size) { |
| 102 | // Validate the size. | 100 | // Validate the size. |
| 103 | R_UNLESS(size == unmap_size, ResultInvalidSize); | 101 | R_UNLESS(size == unmap_size, ResultInvalidSize); |
| 104 | 102 | ||
| 105 | return target_process.PageTable().UnmapPageGroup(address, *page_group, KMemoryState::Shared); | 103 | R_RETURN(target_process.PageTable().UnmapPageGroup(address, *page_group, KMemoryState::Shared)); |
| 106 | } | 104 | } |
| 107 | 105 | ||
| 108 | } // namespace Kernel | 106 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_shared_memory.h b/src/core/hle/kernel/k_shared_memory.h index 8b29f0b4a..bfd01b619 100644 --- a/src/core/hle/kernel/k_shared_memory.h +++ b/src/core/hle/kernel/k_shared_memory.h | |||
| @@ -28,7 +28,7 @@ public: | |||
| 28 | 28 | ||
| 29 | Result Initialize(Core::DeviceMemory& device_memory_, KProcess* owner_process_, | 29 | Result Initialize(Core::DeviceMemory& device_memory_, KProcess* owner_process_, |
| 30 | Svc::MemoryPermission owner_permission_, | 30 | Svc::MemoryPermission owner_permission_, |
| 31 | Svc::MemoryPermission user_permission_, std::size_t size_, std::string name_); | 31 | Svc::MemoryPermission user_permission_, std::size_t size_); |
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * Maps a shared memory block to an address in the target process' address space | 34 | * Maps a shared memory block to an address in the target process' address space |
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 9423f08ca..f4cb861a9 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h | |||
| @@ -926,6 +926,7 @@ private: | |||
| 926 | ThreadWaitReasonForDebugging wait_reason_for_debugging{}; | 926 | ThreadWaitReasonForDebugging wait_reason_for_debugging{}; |
| 927 | uintptr_t argument{}; | 927 | uintptr_t argument{}; |
| 928 | VAddr stack_top{}; | 928 | VAddr stack_top{}; |
| 929 | std::string name{}; | ||
| 929 | 930 | ||
| 930 | public: | 931 | public: |
| 931 | using ConditionVariableThreadTreeType = ConditionVariableThreadTree; | 932 | using ConditionVariableThreadTreeType = ConditionVariableThreadTree; |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index ef7057ff7..59f832a3d 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -742,16 +742,15 @@ struct KernelCore::Impl { | |||
| 742 | hidbus_shared_mem = KSharedMemory::Create(system.Kernel()); | 742 | hidbus_shared_mem = KSharedMemory::Create(system.Kernel()); |
| 743 | 743 | ||
| 744 | hid_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, | 744 | hid_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, |
| 745 | Svc::MemoryPermission::Read, hid_size, "HID:SharedMemory"); | 745 | Svc::MemoryPermission::Read, hid_size); |
| 746 | font_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, | 746 | font_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, |
| 747 | Svc::MemoryPermission::Read, font_size, "Font:SharedMemory"); | 747 | Svc::MemoryPermission::Read, font_size); |
| 748 | irs_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, | 748 | irs_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, |
| 749 | Svc::MemoryPermission::Read, irs_size, "IRS:SharedMemory"); | 749 | Svc::MemoryPermission::Read, irs_size); |
| 750 | time_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, | 750 | time_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, |
| 751 | Svc::MemoryPermission::Read, time_size, "Time:SharedMemory"); | 751 | Svc::MemoryPermission::Read, time_size); |
| 752 | hidbus_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, | 752 | hidbus_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None, |
| 753 | Svc::MemoryPermission::Read, hidbus_size, | 753 | Svc::MemoryPermission::Read, hidbus_size); |
| 754 | "HidBus:SharedMemory"); | ||
| 755 | } | 754 | } |
| 756 | 755 | ||
| 757 | std::mutex registered_objects_lock; | 756 | std::mutex registered_objects_lock; |
diff --git a/src/core/hle/kernel/svc/svc_port.cpp b/src/core/hle/kernel/svc/svc_port.cpp index 78c2a8d17..0b5556bc4 100644 --- a/src/core/hle/kernel/svc/svc_port.cpp +++ b/src/core/hle/kernel/svc/svc_port.cpp | |||
| @@ -81,7 +81,7 @@ Result ManageNamedPort(Core::System& system, Handle* out_server_handle, uint64_t | |||
| 81 | R_UNLESS(port != nullptr, ResultOutOfResource); | 81 | R_UNLESS(port != nullptr, ResultOutOfResource); |
| 82 | 82 | ||
| 83 | // Initialize the new port. | 83 | // Initialize the new port. |
| 84 | port->Initialize(max_sessions, false, ""); | 84 | port->Initialize(max_sessions, false, 0); |
| 85 | 85 | ||
| 86 | // Register the port. | 86 | // Register the port. |
| 87 | KPort::Register(system.Kernel(), port); | 87 | KPort::Register(system.Kernel(), port); |
diff --git a/src/core/hle/kernel/svc/svc_session.cpp b/src/core/hle/kernel/svc/svc_session.cpp index 6dd242dcf..90d680540 100644 --- a/src/core/hle/kernel/svc/svc_session.cpp +++ b/src/core/hle/kernel/svc/svc_session.cpp | |||
| @@ -12,7 +12,7 @@ namespace Kernel::Svc { | |||
| 12 | namespace { | 12 | namespace { |
| 13 | 13 | ||
| 14 | template <typename T> | 14 | template <typename T> |
| 15 | Result CreateSession(Core::System& system, Handle* out_server, Handle* out_client, u64 name) { | 15 | Result CreateSession(Core::System& system, Handle* out_server, Handle* out_client, uint64_t name) { |
| 16 | auto& process = GetCurrentProcess(system.Kernel()); | 16 | auto& process = GetCurrentProcess(system.Kernel()); |
| 17 | auto& handle_table = process.GetHandleTable(); | 17 | auto& handle_table = process.GetHandleTable(); |
| 18 | 18 | ||
| @@ -59,7 +59,7 @@ Result CreateSession(Core::System& system, Handle* out_server, Handle* out_clien | |||
| 59 | R_UNLESS(session != nullptr, ResultOutOfResource); | 59 | R_UNLESS(session != nullptr, ResultOutOfResource); |
| 60 | 60 | ||
| 61 | // Initialize the session. | 61 | // Initialize the session. |
| 62 | session->Initialize(nullptr, fmt::format("{}", name)); | 62 | session->Initialize(nullptr, name); |
| 63 | 63 | ||
| 64 | // Commit the session reservation. | 64 | // Commit the session reservation. |
| 65 | session_reservation.Commit(); | 65 | session_reservation.Commit(); |
diff --git a/src/core/hle/service/ipc_helpers.h b/src/core/hle/service/ipc_helpers.h index 8703b57ca..e4cb4e1f2 100644 --- a/src/core/hle/service/ipc_helpers.h +++ b/src/core/hle/service/ipc_helpers.h | |||
| @@ -155,7 +155,7 @@ public: | |||
| 155 | Kernel::LimitableResource::SessionCountMax, 1); | 155 | Kernel::LimitableResource::SessionCountMax, 1); |
| 156 | 156 | ||
| 157 | auto* session = Kernel::KSession::Create(kernel); | 157 | auto* session = Kernel::KSession::Create(kernel); |
| 158 | session->Initialize(nullptr, iface->GetServiceName()); | 158 | session->Initialize(nullptr, 0); |
| 159 | 159 | ||
| 160 | auto next_manager = std::make_shared<Service::SessionRequestManager>( | 160 | auto next_manager = std::make_shared<Service::SessionRequestManager>( |
| 161 | kernel, manager->GetServerManager()); | 161 | kernel, manager->GetServerManager()); |
diff --git a/src/core/hle/service/server_manager.cpp b/src/core/hle/service/server_manager.cpp index bd04cd023..6b4a1291e 100644 --- a/src/core/hle/service/server_manager.cpp +++ b/src/core/hle/service/server_manager.cpp | |||
| @@ -124,7 +124,7 @@ Result ServerManager::ManageNamedPort(const std::string& service_name, | |||
| 124 | 124 | ||
| 125 | // Create a new port. | 125 | // Create a new port. |
| 126 | auto* port = Kernel::KPort::Create(m_system.Kernel()); | 126 | auto* port = Kernel::KPort::Create(m_system.Kernel()); |
| 127 | port->Initialize(max_sessions, false, service_name); | 127 | port->Initialize(max_sessions, false, 0); |
| 128 | 128 | ||
| 129 | // Register the port. | 129 | // Register the port. |
| 130 | Kernel::KPort::Register(m_system.Kernel(), port); | 130 | Kernel::KPort::Register(m_system.Kernel(), port); |
diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index b4046d3ce..c45be5726 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp | |||
| @@ -62,7 +62,7 @@ Result ServiceManager::RegisterService(std::string name, u32 max_sessions, | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | auto* port = Kernel::KPort::Create(kernel); | 64 | auto* port = Kernel::KPort::Create(kernel); |
| 65 | port->Initialize(ServerSessionCountMax, false, name); | 65 | port->Initialize(ServerSessionCountMax, false, 0); |
| 66 | 66 | ||
| 67 | service_ports.emplace(name, port); | 67 | service_ports.emplace(name, port); |
| 68 | registered_services.emplace(name, handler); | 68 | registered_services.emplace(name, handler); |
| @@ -211,7 +211,7 @@ void SM::RegisterService(HLERequestContext& ctx) { | |||
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | auto* port = Kernel::KPort::Create(kernel); | 213 | auto* port = Kernel::KPort::Create(kernel); |
| 214 | port->Initialize(ServerSessionCountMax, is_light, name); | 214 | port->Initialize(ServerSessionCountMax, is_light, 0); |
| 215 | SCOPE_EXIT({ port->GetClientPort().Close(); }); | 215 | SCOPE_EXIT({ port->GetClientPort().Close(); }); |
| 216 | 216 | ||
| 217 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; | 217 | IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles}; |
diff --git a/src/core/hle/service/sm/sm_controller.cpp b/src/core/hle/service/sm/sm_controller.cpp index 0111c8d7f..419c1df2b 100644 --- a/src/core/hle/service/sm/sm_controller.cpp +++ b/src/core/hle/service/sm/sm_controller.cpp | |||
| @@ -44,7 +44,7 @@ void Controller::CloneCurrentObject(HLERequestContext& ctx) { | |||
| 44 | ASSERT(session != nullptr); | 44 | ASSERT(session != nullptr); |
| 45 | 45 | ||
| 46 | // Initialize the session. | 46 | // Initialize the session. |
| 47 | session->Initialize(nullptr, ""); | 47 | session->Initialize(nullptr, 0); |
| 48 | 48 | ||
| 49 | // Commit the session reservation. | 49 | // Commit the session reservation. |
| 50 | session_reservation.Commit(); | 50 | session_reservation.Commit(); |
diff --git a/src/yuzu/debugger/wait_tree.cpp b/src/yuzu/debugger/wait_tree.cpp index 7f7c5fc42..219912128 100644 --- a/src/yuzu/debugger/wait_tree.cpp +++ b/src/yuzu/debugger/wait_tree.cpp | |||
| @@ -182,10 +182,9 @@ bool WaitTreeExpandableItem::IsExpandable() const { | |||
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | QString WaitTreeSynchronizationObject::GetText() const { | 184 | QString WaitTreeSynchronizationObject::GetText() const { |
| 185 | return tr("[%1] %2 %3") | 185 | return tr("[%1] %2") |
| 186 | .arg(object.GetId()) | 186 | .arg(object.GetId()) |
| 187 | .arg(QString::fromStdString(object.GetTypeObj().GetName()), | 187 | .arg(QString::fromStdString(object.GetTypeObj().GetName())); |
| 188 | QString::fromStdString(object.GetName())); | ||
| 189 | } | 188 | } |
| 190 | 189 | ||
| 191 | std::unique_ptr<WaitTreeSynchronizationObject> WaitTreeSynchronizationObject::make( | 190 | std::unique_ptr<WaitTreeSynchronizationObject> WaitTreeSynchronizationObject::make( |