k_port.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/hle/kernel/hle_ipc.h"
  5. #include "core/hle/kernel/k_port.h"
  6. #include "core/hle/kernel/k_scheduler.h"
  7. #include "core/hle/kernel/svc_results.h"
  8. namespace Kernel {
  9. KPort::KPort(KernelCore& kernel)
  10. : KAutoObjectWithSlabHeapAndContainer{kernel}, server{kernel}, client{kernel} {}
  11. KPort::~KPort() = default;
  12. void KPort::Initialize(s32 max_sessions_, bool is_light_, const std::string& name_) {
  13. // Open a new reference count to the initialized port.
  14. Open();
  15. // Create and initialize our server/client pair.
  16. KAutoObject::Create(std::addressof(server));
  17. KAutoObject::Create(std::addressof(client));
  18. server.Initialize(this, name_ + ":Server");
  19. client.Initialize(this, max_sessions_, name_ + ":Client");
  20. // Set our member variables.
  21. is_light = is_light_;
  22. name = name_;
  23. state = State::Normal;
  24. }
  25. void KPort::OnClientClosed() {
  26. KScopedSchedulerLock sl{kernel};
  27. if (state == State::Normal) {
  28. state = State::ClientClosed;
  29. }
  30. }
  31. void KPort::OnServerClosed() {
  32. KScopedSchedulerLock sl{kernel};
  33. if (state == State::Normal) {
  34. state = State::ServerClosed;
  35. }
  36. }
  37. bool KPort::IsServerClosed() const {
  38. KScopedSchedulerLock sl{kernel};
  39. return state == State::ServerClosed;
  40. }
  41. ResultCode KPort::EnqueueSession(KServerSession* session) {
  42. KScopedSchedulerLock sl{kernel};
  43. R_UNLESS(state == State::Normal, ResultPortClosed);
  44. if (server.HasHLEHandler()) {
  45. server.GetHLEHandler()->ClientConnected(session);
  46. } else {
  47. server.EnqueueSession(session);
  48. }
  49. return RESULT_SUCCESS;
  50. }
  51. } // namespace Kernel