diff options
author | bunnei <bunneidev@gmail.com> | 2021-04-22 06:53:56 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2021-05-06 01:40:52 +0200 |
commit | 7a068641006da739d6af5681a022018785379365 (patch) | |
tree | aee13360312f8fb9ab9b64310cc478fcc6a5efb1 /src/core/hle/kernel/k_server_port.cpp | |
parent | hle: kernel: Migrate KClientPort to KAutoObject. (diff) | |
download | yuzu-7a068641006da739d6af5681a022018785379365.tar yuzu-7a068641006da739d6af5681a022018785379365.tar.gz yuzu-7a068641006da739d6af5681a022018785379365.tar.bz2 yuzu-7a068641006da739d6af5681a022018785379365.tar.lz yuzu-7a068641006da739d6af5681a022018785379365.tar.xz yuzu-7a068641006da739d6af5681a022018785379365.tar.zst yuzu-7a068641006da739d6af5681a022018785379365.zip |
Diffstat (limited to 'src/core/hle/kernel/k_server_port.cpp')
-rw-r--r-- | src/core/hle/kernel/k_server_port.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp new file mode 100644 index 000000000..2c51d66db --- /dev/null +++ b/src/core/hle/kernel/k_server_port.cpp @@ -0,0 +1,65 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <tuple> +#include "common/assert.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_server_port.h" +#include "core/hle/kernel/k_server_session.h" +#include "core/hle/kernel/k_thread.h" +#include "core/hle/kernel/object.h" +#include "core/hle/kernel/svc_results.h" + +namespace Kernel { + +KServerPort::KServerPort(KernelCore& kernel) : KSynchronizationObject{kernel} {} +KServerPort::~KServerPort() = default; + +void KServerPort::Initialize(std::string&& name_) { + // Set member variables. + name = std::move(name_); +} + +ResultVal<KServerSession*> KServerPort::Accept() { + if (pending_sessions.empty()) { + return ResultNotFound; + } + + auto* session = pending_sessions.back(); + pending_sessions.pop_back(); + return MakeResult(session); +} + +void KServerPort::AppendPendingSession(KServerSession* pending_session) { + pending_sessions.push_back(std::move(pending_session)); + if (pending_sessions.size() == 1) { + NotifyAvailable(); + } +} + +void KServerPort::Destroy() {} + +bool KServerPort::IsSignaled() const { + return !pending_sessions.empty(); +} + +KServerPort::PortPair KServerPort::CreatePortPair(KernelCore& kernel, u32 max_sessions, + std::string name) { + KServerPort* server_port = new KServerPort(kernel); + KClientPort* client_port = new KClientPort(kernel); + + KAutoObject::Create(server_port); + KAutoObject::Create(client_port); + + server_port->Initialize(name + "_Server"); + client_port->Initialize(max_sessions, name + "_Client"); + + client_port->server_port = server_port; + + server_port->name = name + "_Server"; + + return std::make_pair(server_port, client_port); +} + +} // namespace Kernel |