Просмотр исходного кода

hle: service: Implement IPC::CommandType::Close.

- This was not actually closing sessions before.
bunnei 5 лет назад
Родитель
Сommit
da25a59866

+ 2 - 2
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) {

+ 11 - 8
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;

+ 2 - 1
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.