mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Return an error code when connecting to a saturated port.
The error code was taken from the 3DS kernel.
This commit is contained in:
		
							parent
							
								
									61a2fe8c3b
								
							
						
					
					
						commit
						c93c5a72bb
					
				@ -14,7 +14,14 @@ namespace Kernel {
 | 
			
		||||
ClientPort::ClientPort() {}
 | 
			
		||||
ClientPort::~ClientPort() {}
 | 
			
		||||
 | 
			
		||||
SharedPtr<ClientSession> ClientPort::Connect() {
 | 
			
		||||
ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
 | 
			
		||||
    if (active_sessions >= max_sessions) {
 | 
			
		||||
        return ResultCode(ErrorDescription::MaxConnectionsReached,
 | 
			
		||||
                          ErrorModule::OS, ErrorSummary::WouldBlock,
 | 
			
		||||
                          ErrorLevel::Temporary);
 | 
			
		||||
    }
 | 
			
		||||
    active_sessions++;
 | 
			
		||||
 | 
			
		||||
    // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
 | 
			
		||||
    auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler);
 | 
			
		||||
    auto client_session = std::get<SharedPtr<ClientSession>>(sessions);
 | 
			
		||||
@ -25,7 +32,7 @@ SharedPtr<ClientSession> ClientPort::Connect() {
 | 
			
		||||
    // Wake the threads waiting on the ServerPort
 | 
			
		||||
    server_port->WakeupAllWaitingThreads();
 | 
			
		||||
 | 
			
		||||
    return std::move(client_session);
 | 
			
		||||
    return MakeResult<SharedPtr<ClientSession>>(std::move(client_session));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 | 
			
		||||
@ -31,9 +31,9 @@ public:
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's list of pending sessions,
 | 
			
		||||
     * and signals the ServerPort, causing any threads waiting on it to awake.
 | 
			
		||||
     * @returns ClientSession The client endpoint of the created Session pair.
 | 
			
		||||
     * @returns ClientSession The client endpoint of the created Session pair, or error code.
 | 
			
		||||
     */
 | 
			
		||||
    SharedPtr<ClientSession> Connect();
 | 
			
		||||
    ResultVal<SharedPtr<ClientSession>> Connect();
 | 
			
		||||
 | 
			
		||||
    SharedPtr<ServerPort> server_port; ///< ServerPort associated with this client port.
 | 
			
		||||
    u32 max_sessions;    ///< Maximum number of simultaneous sessions the port can have
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@ enum class ErrorDescription : u32 {
 | 
			
		||||
    Success = 0,
 | 
			
		||||
    WrongPermission = 46,
 | 
			
		||||
    OS_InvalidBufferDescriptor = 48,
 | 
			
		||||
    MaxConnectionsReached = 52,
 | 
			
		||||
    WrongAddress = 53,
 | 
			
		||||
    FS_ArchiveNotMounted = 101,
 | 
			
		||||
    FS_FileNotFound = 112,
 | 
			
		||||
 | 
			
		||||
@ -93,8 +93,12 @@ static void GetServiceHandle(Service::Interface* self) {
 | 
			
		||||
        // Connect to the port and retrieve the client endpoint of the connection Session.
 | 
			
		||||
        auto client_session = client_port->Connect();
 | 
			
		||||
 | 
			
		||||
        // Return the client session
 | 
			
		||||
        cmd_buff[3] = Kernel::g_handle_table.Create(client_session).MoveFrom();
 | 
			
		||||
        res = client_session.Code();
 | 
			
		||||
 | 
			
		||||
        if (client_session.Succeeded()) {
 | 
			
		||||
            // Return the client session
 | 
			
		||||
            cmd_buff[3] = Kernel::g_handle_table.Create(*client_session).MoveFrom();
 | 
			
		||||
        }
 | 
			
		||||
        LOG_TRACE(Service_SRV, "called port=%s, handle=0x%08X", port_name.c_str(), cmd_buff[3]);
 | 
			
		||||
    } else {
 | 
			
		||||
        LOG_ERROR(Service_SRV, "(UNIMPLEMENTED) called port=%s", port_name.c_str());
 | 
			
		||||
 | 
			
		||||
@ -227,7 +227,8 @@ static ResultCode ConnectToPort(Handle* out_handle, const char* port_name) {
 | 
			
		||||
    auto client_port = it->second;
 | 
			
		||||
 | 
			
		||||
    // Connect to the port and retrieve the client endpoint of the connection Session.
 | 
			
		||||
    auto client_session = client_port->Connect();
 | 
			
		||||
    SharedPtr<Kernel::ClientSession> client_session;
 | 
			
		||||
    CASCADE_RESULT(client_session, client_port->Connect());
 | 
			
		||||
 | 
			
		||||
    // Note: Threads do not wait for the server endpoint to call
 | 
			
		||||
    // AcceptSession before returning from this call.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user