From 834fa5db65ab3bc2e05474e280f5a0a73be7411e Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 28 Dec 2017 23:12:28 -0500 Subject: [PATCH] kernel: Add SyncObject primitive, use it for ClientSession. --- src/core/CMakeLists.txt | 1 + src/core/hle/kernel/client_session.h | 11 +++------ src/core/hle/kernel/sync_object.h | 35 ++++++++++++++++++++++++++++ src/core/hle/svc.cpp | 4 ++-- 4 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 src/core/hle/kernel/sync_object.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index cbf20823f7..29abb703f0 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -132,6 +132,7 @@ set(HEADERS hle/kernel/server_session.h hle/kernel/session.h hle/kernel/shared_memory.h + hle/kernel/sync_object.h hle/kernel/thread.h hle/kernel/timer.h hle/kernel/vm_manager.h diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index daf521529e..671174ec48 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h @@ -7,7 +7,7 @@ #include #include #include "common/common_types.h" -#include "core/hle/kernel/kernel.h" +#include "core/hle/kernel/sync_object.h" #include "core/hle/result.h" namespace Kernel { @@ -16,7 +16,7 @@ class ServerSession; class Session; class Thread; -class ClientSession final : public Object { +class ClientSession final : public SyncObject { public: friend class ServerSession; @@ -33,12 +33,7 @@ public: return HANDLE_TYPE; } - /** - * Sends an SyncRequest from the current emulated thread. - * @param thread Thread that initiated the request. - * @return ResultCode of the operation. - */ - ResultCode SendSyncRequest(SharedPtr thread); + ResultCode SendSyncRequest(SharedPtr thread) override; std::string name; ///< Name of client port (optional) diff --git a/src/core/hle/kernel/sync_object.h b/src/core/hle/kernel/sync_object.h new file mode 100644 index 0000000000..ce2835ca4b --- /dev/null +++ b/src/core/hle/kernel/sync_object.h @@ -0,0 +1,35 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include "core/hle/kernel/kernel.h" +#include "core/hle/result.h" + +namespace Kernel { + +class Thread; + +/// Class that represents a Kernel object that svcSendSyncRequest can be called on +class SyncObject : public Object { +public: + /** + * Handle a sync request from the emulated application. + * @param thread Thread that initiated the request. + * @returns ResultCode from the operation. + */ + virtual ResultCode SendSyncRequest(SharedPtr thread) = 0; +}; + +// Specialization of DynamicObjectCast for SyncObjects +template <> +inline SharedPtr DynamicObjectCast(SharedPtr object) { + if (object != nullptr && object->IsSyncable()) { + return boost::static_pointer_cast(std::move(object)); + } + return nullptr; +} + +} // namespace Kernel diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp index 47041afd44..9db3d632a6 100644 --- a/src/core/hle/svc.cpp +++ b/src/core/hle/svc.cpp @@ -10,6 +10,7 @@ #include "core/hle/kernel/client_session.h" #include "core/hle/kernel/handle_table.h" #include "core/hle/kernel/process.h" +#include "core/hle/kernel/sync_object.h" #include "core/hle/kernel/thread.h" #include "core/hle/lock.h" #include "core/hle/result.h" @@ -71,8 +72,7 @@ static ResultCode ConnectToPort(Kernel::Handle* out_handle, VAddr port_name_addr /// Makes a blocking IPC call to an OS service. static ResultCode SendSyncRequest(Kernel::Handle handle) { - SharedPtr session = - Kernel::g_handle_table.Get(handle); + SharedPtr session = Kernel::g_handle_table.Get(handle); if (session == nullptr) { LOG_ERROR(Kernel_SVC, "called with invalid handle=0x%08X", handle); return ERR_INVALID_HANDLE;