diff options
| author | 2022-10-16 01:53:56 -0400 | |
|---|---|---|
| committer | 2022-10-31 17:44:06 -0400 | |
| commit | 983f2b70741f17f30fe2321451f10cabecc013d2 (patch) | |
| tree | c1ac3c1033fdeefaabe76590ca204c4c1b2a98cd /src/core/hle/ipc_helpers.h | |
| parent | Merge pull request #9159 from liamwhite/kbork (diff) | |
| download | yuzu-983f2b70741f17f30fe2321451f10cabecc013d2.tar.gz yuzu-983f2b70741f17f30fe2321451f10cabecc013d2.tar.xz yuzu-983f2b70741f17f30fe2321451f10cabecc013d2.zip | |
kernel: invert session request handling flow
Diffstat (limited to 'src/core/hle/ipc_helpers.h')
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index 18fde8bd6..3bb111748 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -86,13 +86,13 @@ public: | |||
| 86 | u32 num_domain_objects{}; | 86 | u32 num_domain_objects{}; |
| 87 | const bool always_move_handles{ | 87 | const bool always_move_handles{ |
| 88 | (static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0}; | 88 | (static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0}; |
| 89 | if (!ctx.Session()->GetSessionRequestManager()->IsDomain() || always_move_handles) { | 89 | if (!ctx.GetManager()->IsDomain() || always_move_handles) { |
| 90 | num_handles_to_move = num_objects_to_move; | 90 | num_handles_to_move = num_objects_to_move; |
| 91 | } else { | 91 | } else { |
| 92 | num_domain_objects = num_objects_to_move; | 92 | num_domain_objects = num_objects_to_move; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | if (ctx.Session()->GetSessionRequestManager()->IsDomain()) { | 95 | if (ctx.GetManager()->IsDomain()) { |
| 96 | raw_data_size += | 96 | raw_data_size += |
| 97 | static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects); | 97 | static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects); |
| 98 | ctx.write_size += num_domain_objects; | 98 | ctx.write_size += num_domain_objects; |
| @@ -125,8 +125,7 @@ public: | |||
| 125 | if (!ctx.IsTipc()) { | 125 | if (!ctx.IsTipc()) { |
| 126 | AlignWithPadding(); | 126 | AlignWithPadding(); |
| 127 | 127 | ||
| 128 | if (ctx.Session()->GetSessionRequestManager()->IsDomain() && | 128 | if (ctx.GetManager()->IsDomain() && ctx.HasDomainMessageHeader()) { |
| 129 | ctx.HasDomainMessageHeader()) { | ||
| 130 | IPC::DomainMessageHeader domain_header{}; | 129 | IPC::DomainMessageHeader domain_header{}; |
| 131 | domain_header.num_objects = num_domain_objects; | 130 | domain_header.num_objects = num_domain_objects; |
| 132 | PushRaw(domain_header); | 131 | PushRaw(domain_header); |
| @@ -146,18 +145,18 @@ public: | |||
| 146 | 145 | ||
| 147 | template <class T> | 146 | template <class T> |
| 148 | void PushIpcInterface(std::shared_ptr<T> iface) { | 147 | void PushIpcInterface(std::shared_ptr<T> iface) { |
| 149 | if (context->Session()->GetSessionRequestManager()->IsDomain()) { | 148 | if (context->GetManager()->IsDomain()) { |
| 150 | context->AddDomainObject(std::move(iface)); | 149 | context->AddDomainObject(std::move(iface)); |
| 151 | } else { | 150 | } else { |
| 152 | kernel.CurrentProcess()->GetResourceLimit()->Reserve( | 151 | kernel.CurrentProcess()->GetResourceLimit()->Reserve( |
| 153 | Kernel::LimitableResource::Sessions, 1); | 152 | Kernel::LimitableResource::Sessions, 1); |
| 154 | 153 | ||
| 155 | auto* session = Kernel::KSession::Create(kernel); | 154 | auto* session = Kernel::KSession::Create(kernel); |
| 156 | session->Initialize(nullptr, iface->GetServiceName(), | 155 | session->Initialize(nullptr, iface->GetServiceName()); |
| 157 | std::make_shared<Kernel::SessionRequestManager>(kernel)); | 156 | iface->RegisterSession(&session->GetServerSession(), |
| 157 | std::make_shared<Kernel::SessionRequestManager>(kernel)); | ||
| 158 | 158 | ||
| 159 | context->AddMoveObject(&session->GetClientSession()); | 159 | context->AddMoveObject(&session->GetClientSession()); |
| 160 | iface->ClientConnected(&session->GetServerSession()); | ||
| 161 | } | 160 | } |
| 162 | } | 161 | } |
| 163 | 162 | ||
| @@ -387,7 +386,7 @@ public: | |||
| 387 | 386 | ||
| 388 | template <class T> | 387 | template <class T> |
| 389 | std::weak_ptr<T> PopIpcInterface() { | 388 | std::weak_ptr<T> PopIpcInterface() { |
| 390 | ASSERT(context->Session()->GetSessionRequestManager()->IsDomain()); | 389 | ASSERT(context->GetManager()->IsDomain()); |
| 391 | ASSERT(context->GetDomainMessageHeader().input_object_count > 0); | 390 | ASSERT(context->GetDomainMessageHeader().input_object_count > 0); |
| 392 | return context->GetDomainHandler<T>(Pop<u32>() - 1); | 391 | return context->GetDomainHandler<T>(Pop<u32>() - 1); |
| 393 | } | 392 | } |