summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/k_server_session.cpp4
-rw-r--r--src/core/hle/service/service.cpp19
-rw-r--r--src/core/hle/service/service.h3
3 files changed, 15 insertions, 11 deletions
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp
index b28cc2499..8850d9af5 100644
--- a/src/core/hle/kernel/k_server_session.cpp
+++ b/src/core/hle/kernel/k_server_session.cpp
@@ -95,7 +95,7 @@ ResultCode KServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& co
UNREACHABLE();
return RESULT_SUCCESS; // Ignore error if asserts are off
}
- return domain_request_handlers[object_id - 1]->HandleSyncRequest(context);
+ return domain_request_handlers[object_id - 1]->HandleSyncRequest(*this, context);
case IPC::DomainMessageHeader::CommandType::CloseVirtualHandle: {
LOG_DEBUG(IPC, "CloseVirtualHandle, object_id=0x{:08X}", object_id);
@@ -135,7 +135,7 @@ ResultCode KServerSession::CompleteSyncRequest(HLERequestContext& context) {
// If there is no domain header, the regular session handler is used
} else if (hle_handler != nullptr) {
// If this ServerSession has an associated HLE handler, forward the request to it.
- result = hle_handler->HandleSyncRequest(context);
+ result = hle_handler->HandleSyncRequest(*this, context);
}
if (convert_to_domain) {
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index d7e09e8f1..e36c35a86 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -167,33 +167,36 @@ void ServiceFrameworkBase::InvokeRequest(Kernel::HLERequestContext& ctx) {
handler_invoker(this, info->handler_callback, ctx);
}
-ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& context) {
+ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session,
+ Kernel::HLERequestContext& ctx) {
const auto guard = LockService();
- switch (context.GetCommandType()) {
- case IPC::CommandType::Close: {
- IPC::ResponseBuilder rb{context, 2};
+ switch (ctx.GetCommandType()) {
+ case IPC::CommandType::Close:
+ case IPC::CommandType::TIPC_Close: {
+ session.Close();
+ IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS);
return IPC::ERR_REMOTE_PROCESS_DEAD;
}
case IPC::CommandType::ControlWithContext:
case IPC::CommandType::Control: {
- system.ServiceManager().InvokeControlRequest(context);
+ system.ServiceManager().InvokeControlRequest(ctx);
break;
}
case IPC::CommandType::RequestWithContext:
case IPC::CommandType::Request: {
- InvokeRequest(context);
+ InvokeRequest(ctx);
break;
}
default:
- UNIMPLEMENTED_MSG("command_type={}", context.GetCommandType());
+ UNIMPLEMENTED_MSG("command_type={}", ctx.GetCommandType());
}
// If emulation was shutdown, we are closing service threads, do not write the response back to
// memory that may be shutting down as well.
if (system.IsPoweredOn()) {
- context.WriteToOutgoingCommandBuffer(context.GetThread());
+ ctx.WriteToOutgoingCommandBuffer(ctx.GetThread());
}
return RESULT_SUCCESS;
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h
index 16357b156..51e22a791 100644
--- a/src/core/hle/service/service.h
+++ b/src/core/hle/service/service.h
@@ -71,7 +71,8 @@ public:
Kernel::KClientPort& CreatePort(Kernel::KernelCore& kernel);
/// Handles a synchronization request for the service.
- ResultCode HandleSyncRequest(Kernel::HLERequestContext& context) override;
+ ResultCode HandleSyncRequest(Kernel::KServerSession& session,
+ Kernel::HLERequestContext& context) override;
protected:
/// Member-function pointer type of SyncRequest handlers.