client_port.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Copyright 2016 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/assert.h"
  5. #include "core/hle/kernel/client_port.h"
  6. #include "core/hle/kernel/client_session.h"
  7. #include "core/hle/kernel/kernel.h"
  8. #include "core/hle/kernel/server_port.h"
  9. #include "core/hle/kernel/server_session.h"
  10. namespace Kernel {
  11. ClientPort::ClientPort() {}
  12. ClientPort::~ClientPort() {}
  13. ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
  14. // Note: Threads do not wait for the server endpoint to call
  15. // AcceptSession before returning from this call.
  16. if (active_sessions >= max_sessions) {
  17. // TODO(Subv): Return an error code in this situation after session disconnection is
  18. // implemented.
  19. /*return ResultCode(ErrorDescription::MaxConnectionsReached,
  20. ErrorModule::OS, ErrorSummary::WouldBlock,
  21. ErrorLevel::Temporary);*/
  22. }
  23. active_sessions++;
  24. // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
  25. auto sessions =
  26. ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler);
  27. auto client_session = std::get<SharedPtr<ClientSession>>(sessions);
  28. auto server_session = std::get<SharedPtr<ServerSession>>(sessions);
  29. if (server_port->hle_handler)
  30. server_port->hle_handler->ClientConnected(server_session);
  31. server_port->pending_sessions.push_back(std::move(server_session));
  32. // Wake the threads waiting on the ServerPort
  33. server_port->WakeupAllWaitingThreads();
  34. return MakeResult<SharedPtr<ClientSession>>(std::move(client_session));
  35. }
  36. } // namespace