kernel: Add SyncObject primitive, use it for ClientSession.
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #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> thread); | ||||
|     ResultCode SendSyncRequest(SharedPtr<Thread> thread) override; | ||||
|  | ||||
|     std::string name; ///< Name of client port (optional) | ||||
|  | ||||
|   | ||||
							
								
								
									
										35
									
								
								src/core/hle/kernel/sync_object.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/core/hle/kernel/sync_object.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <boost/smart_ptr/intrusive_ptr.hpp> | ||||
| #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> thread) = 0; | ||||
| }; | ||||
|  | ||||
| // Specialization of DynamicObjectCast for SyncObjects | ||||
| template <> | ||||
| inline SharedPtr<SyncObject> DynamicObjectCast<SyncObject>(SharedPtr<Object> object) { | ||||
|     if (object != nullptr && object->IsSyncable()) { | ||||
|         return boost::static_pointer_cast<SyncObject>(std::move(object)); | ||||
|     } | ||||
|     return nullptr; | ||||
| } | ||||
|  | ||||
| } // namespace Kernel | ||||
| @@ -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<Kernel::ClientSession> session = | ||||
|         Kernel::g_handle_table.Get<Kernel::ClientSession>(handle); | ||||
|     SharedPtr<Kernel::SyncObject> session = Kernel::g_handle_table.Get<Kernel::SyncObject>(handle); | ||||
|     if (session == nullptr) { | ||||
|         LOG_ERROR(Kernel_SVC, "called with invalid handle=0x%08X", handle); | ||||
|         return ERR_INVALID_HANDLE; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user