mirror of https://git.suyu.dev/suyu/suyu
kernel: Implement a more accurate IPC dispatch.
parent
e3ee017e91
commit
c3d3b173d3
@ -1,12 +1,36 @@
|
|||||||
// Copyright 2015 Citra Emulator Project
|
// Copyright 2019 yuzu emulator team
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "core/hle/kernel/client_session.h"
|
||||||
|
#include "core/hle/kernel/server_session.h"
|
||||||
#include "core/hle/kernel/session.h"
|
#include "core/hle/kernel/session.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
Session::Session() {}
|
Session::Session(KernelCore& kernel) : WaitObject{kernel} {}
|
||||||
Session::~Session() {}
|
Session::~Session() = default;
|
||||||
|
|
||||||
|
Session::SessionPair Session::Create(KernelCore& kernel, std::string name) {
|
||||||
|
auto session{std::make_shared<Session>(kernel)};
|
||||||
|
auto client_session{Kernel::ClientSession::Create(kernel, session, name + "_Client").Unwrap()};
|
||||||
|
auto server_session{Kernel::ServerSession::Create(kernel, session, name + "_Server").Unwrap()};
|
||||||
|
|
||||||
|
session->name = std::move(name);
|
||||||
|
session->client = client_session;
|
||||||
|
session->server = server_session;
|
||||||
|
|
||||||
|
return std::make_pair(std::move(client_session), std::move(server_session));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Session::ShouldWait(const Thread* thread) const {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
void Session::Acquire(Thread* thread) {
|
||||||
|
UNIMPLEMENTED();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
@ -1,27 +1,64 @@
|
|||||||
// Copyright 2018 yuzu emulator team
|
// Copyright 2019 yuzu emulator team
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/hle/kernel/object.h"
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "core/hle/kernel/wait_object.h"
|
||||||
|
#include "core/hle/result.h"
|
||||||
|
|
||||||
namespace Kernel {
|
namespace Kernel {
|
||||||
|
|
||||||
class ClientSession;
|
class ClientSession;
|
||||||
class ClientPort;
|
|
||||||
class ServerSession;
|
class ServerSession;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent structure to link the client and server endpoints of a session with their associated
|
* Parent structure to link the client and server endpoints of a session with their associated
|
||||||
* client port. The client port need not exist, as is the case for portless sessions like the
|
* client port.
|
||||||
* FS File and Directory sessions. When one of the endpoints of a session is destroyed, its
|
|
||||||
* corresponding field in this structure will be set to nullptr.
|
|
||||||
*/
|
*/
|
||||||
class Session final {
|
class Session final : public WaitObject {
|
||||||
public:
|
public:
|
||||||
std::weak_ptr<ClientSession> client; ///< The client endpoint of the session.
|
explicit Session(KernelCore& kernel);
|
||||||
std::weak_ptr<ServerSession> server; ///< The server endpoint of the session.
|
~Session() override;
|
||||||
std::shared_ptr<ClientPort> port; ///< The port that this session is associated with (optional).
|
|
||||||
|
using SessionPair = std::pair<std::shared_ptr<ClientSession>, std::shared_ptr<ServerSession>>;
|
||||||
|
|
||||||
|
static SessionPair Create(KernelCore& kernel, std::string name = "Unknown");
|
||||||
|
|
||||||
|
std::string GetName() const override {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr HandleType HANDLE_TYPE = HandleType::Session;
|
||||||
|
HandleType GetHandleType() const override {
|
||||||
|
return HANDLE_TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ShouldWait(const Thread* thread) const override;
|
||||||
|
|
||||||
|
void Acquire(Thread* thread) override;
|
||||||
|
|
||||||
|
std::shared_ptr<ClientSession> Client() {
|
||||||
|
if (auto result{client.lock()}) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<ServerSession> Server() {
|
||||||
|
if (auto result{server.lock()}) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string name;
|
||||||
|
std::weak_ptr<ClientSession> client;
|
||||||
|
std::weak_ptr<ServerSession> server;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Kernel
|
} // namespace Kernel
|
||||||
|
Loading…
Reference in New Issue