k_port.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/hle/kernel/k_port.h"
  4. #include "core/hle/kernel/k_scheduler.h"
  5. #include "core/hle/kernel/svc_results.h"
  6. namespace Kernel {
  7. KPort::KPort(KernelCore& kernel)
  8. : KAutoObjectWithSlabHeapAndContainer{kernel}, m_server{kernel}, m_client{kernel} {}
  9. KPort::~KPort() = default;
  10. void KPort::Initialize(s32 max_sessions, bool is_light, uintptr_t name) {
  11. // Open a new reference count to the initialized port.
  12. this->Open();
  13. // Create and initialize our server/client pair.
  14. KAutoObject::Create(std::addressof(m_server));
  15. KAutoObject::Create(std::addressof(m_client));
  16. m_server.Initialize(this);
  17. m_client.Initialize(this, max_sessions);
  18. // Set our member variables.
  19. m_is_light = is_light;
  20. m_name = name;
  21. m_state = State::Normal;
  22. }
  23. void KPort::OnClientClosed() {
  24. KScopedSchedulerLock sl{m_kernel};
  25. if (m_state == State::Normal) {
  26. m_state = State::ClientClosed;
  27. }
  28. }
  29. void KPort::OnServerClosed() {
  30. KScopedSchedulerLock sl{m_kernel};
  31. if (m_state == State::Normal) {
  32. m_state = State::ServerClosed;
  33. }
  34. }
  35. bool KPort::IsServerClosed() const {
  36. KScopedSchedulerLock sl{m_kernel};
  37. return m_state == State::ServerClosed;
  38. }
  39. Result KPort::EnqueueSession(KServerSession* session) {
  40. KScopedSchedulerLock sl{m_kernel};
  41. R_UNLESS(m_state == State::Normal, ResultPortClosed);
  42. m_server.EnqueueSession(session);
  43. R_SUCCEED();
  44. }
  45. } // namespace Kernel