From ae37b404c6c5c3d971a710201cc8a0914821a536 Mon Sep 17 00:00:00 2001 From: B3n30 Date: Sun, 2 Sep 2018 16:42:41 +0200 Subject: [PATCH] fixup! fixup! Service::SM: Wait till client is registered --- src/core/hle/service/sm/srv.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/core/hle/service/sm/srv.cpp b/src/core/hle/service/sm/srv.cpp index a7b494bd1..a7278db9c 100644 --- a/src/core/hle/service/sm/srv.cpp +++ b/src/core/hle/service/sm/srv.cpp @@ -100,7 +100,7 @@ void SRV::GetServiceHandle(Kernel::HLERequestContext& ctx) { // TODO(yuriks): Permission checks go here - auto get_handle = [name, this, wait_until_available](Kernel::SharedPtr thread, + auto get_handle = [name, this](Kernel::SharedPtr thread, Kernel::HLERequestContext& ctx, ThreadWakeupReason reason) { LOG_ERROR(Service_SRV, "called service={} wakeup", name); @@ -113,11 +113,9 @@ void SRV::GetServiceHandle(Kernel::HLERequestContext& ctx) { IPC::RequestBuilder rb(ctx, 0x5, 1, 2); rb.Push(session.Code()); rb.PushMoveObjects(std::move(session).Unwrap()); - } else if (session.Code() == Kernel::ERR_MAX_CONNECTIONS_REACHED && wait_until_available) { - LOG_WARNING(Service_SRV, "called service={} -> ERR_MAX_CONNECTIONS_REACHED", name); - // TODO(Subv): Put the caller guest thread to sleep until this port becomes available - // again. - UNIMPLEMENTED_MSG("Unimplemented wait until port {} is available.", name); + } else if (session.Code() == Kernel::ERR_MAX_CONNECTIONS_REACHED) { + LOG_ERROR(Service_SRV, "called service={} -> ERR_MAX_CONNECTIONS_REACHED", name); + UNREACHABLE(); } else { LOG_ERROR(Service_SRV, "called service={} -> error 0x{:08X}", name, session.Code().raw); IPC::RequestBuilder rb(ctx, 0x5, 1, 0); @@ -127,8 +125,8 @@ void SRV::GetServiceHandle(Kernel::HLERequestContext& ctx) { auto client_port = service_manager->GetServicePort(name); if (client_port.Failed()) { - if (wait_until_available) { - LOG_ERROR(Service_SRV, "called service={} delayed", name); + if (wait_until_available && client_port.Code() == ERR_SERVICE_NOT_REGISTERED) { + LOG_INFO(Service_SRV, "called service={} delayed", name); Kernel::SharedPtr get_service_handle_event = ctx.SleepClientThread(Kernel::GetCurrentThread(), "GetServiceHandle", std::chrono::nanoseconds(-1), get_handle); @@ -235,9 +233,10 @@ void SRV::RegisterService(Kernel::HLERequestContext& ctx) { return; } - if (get_service_handle_delayed_map.find(name) != get_service_handle_delayed_map.end()) { - get_service_handle_delayed_map.at(name)->Signal(); - get_service_handle_delayed_map.erase(name); + auto it = get_service_handle_delayed_map.find(name); + if (it != get_service_handle_delayed_map.end()) { + it->second->Signal(); + get_service_handle_delayed_map.erase(it); } IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);