k_port.cpp 1.6 KB

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