diff options
| author | 2020-12-28 18:23:42 -0800 | |
|---|---|---|
| committer | 2020-12-28 21:33:34 -0800 | |
| commit | 7d77a3f88f7a1e68d9846ca7c69cce051d1a33d2 (patch) | |
| tree | be882bb9b5d144861673178a1fdaad9a19504c5a /src/core/hle/service/service.cpp | |
| parent | audio_core: stream: Ensure buffer is valid before release. (diff) | |
| download | yuzu-7d77a3f88f7a1e68d9846ca7c69cce051d1a33d2.tar.gz yuzu-7d77a3f88f7a1e68d9846ca7c69cce051d1a33d2.tar.xz yuzu-7d77a3f88f7a1e68d9846ca7c69cce051d1a33d2.zip | |
hle: service: Acquire and release a lock on requests.
- This makes it such that we can safely access service members from CoreTiming thread.
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index d55fba831..ff2a5b1db 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -95,9 +95,14 @@ ServiceFrameworkBase::ServiceFrameworkBase(Core::System& system_, const char* se | |||
| 95 | : system{system_}, service_name{service_name_}, max_sessions{max_sessions_}, | 95 | : system{system_}, service_name{service_name_}, max_sessions{max_sessions_}, |
| 96 | handler_invoker{handler_invoker_} {} | 96 | handler_invoker{handler_invoker_} {} |
| 97 | 97 | ||
| 98 | ServiceFrameworkBase::~ServiceFrameworkBase() = default; | 98 | ServiceFrameworkBase::~ServiceFrameworkBase() { |
| 99 | // Wait for other threads to release access before destroying | ||
| 100 | const auto guard = LockService(); | ||
| 101 | } | ||
| 99 | 102 | ||
| 100 | void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { | 103 | void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { |
| 104 | const auto guard = LockService(); | ||
| 105 | |||
| 101 | ASSERT(!port_installed); | 106 | ASSERT(!port_installed); |
| 102 | 107 | ||
| 103 | auto port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); | 108 | auto port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); |
| @@ -106,6 +111,8 @@ void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) | |||
| 106 | } | 111 | } |
| 107 | 112 | ||
| 108 | void ServiceFrameworkBase::InstallAsNamedPort(Kernel::KernelCore& kernel) { | 113 | void ServiceFrameworkBase::InstallAsNamedPort(Kernel::KernelCore& kernel) { |
| 114 | const auto guard = LockService(); | ||
| 115 | |||
| 109 | ASSERT(!port_installed); | 116 | ASSERT(!port_installed); |
| 110 | 117 | ||
| 111 | auto [server_port, client_port] = | 118 | auto [server_port, client_port] = |
| @@ -115,17 +122,6 @@ void ServiceFrameworkBase::InstallAsNamedPort(Kernel::KernelCore& kernel) { | |||
| 115 | port_installed = true; | 122 | port_installed = true; |
| 116 | } | 123 | } |
| 117 | 124 | ||
| 118 | std::shared_ptr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort(Kernel::KernelCore& kernel) { | ||
| 119 | ASSERT(!port_installed); | ||
| 120 | |||
| 121 | auto [server_port, client_port] = | ||
| 122 | Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); | ||
| 123 | auto port = MakeResult(std::move(server_port)).Unwrap(); | ||
| 124 | port->SetHleHandler(shared_from_this()); | ||
| 125 | port_installed = true; | ||
| 126 | return client_port; | ||
| 127 | } | ||
| 128 | |||
| 129 | void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { | 125 | void ServiceFrameworkBase::RegisterHandlersBase(const FunctionInfoBase* functions, std::size_t n) { |
| 130 | handlers.reserve(handlers.size() + n); | 126 | handlers.reserve(handlers.size() + n); |
| 131 | for (std::size_t i = 0; i < n; ++i) { | 127 | for (std::size_t i = 0; i < n; ++i) { |
| @@ -164,6 +160,8 @@ void ServiceFrameworkBase::InvokeRequest(Kernel::HLERequestContext& ctx) { | |||
| 164 | } | 160 | } |
| 165 | 161 | ||
| 166 | ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& context) { | 162 | ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& context) { |
| 163 | const auto guard = LockService(); | ||
| 164 | |||
| 167 | switch (context.GetCommandType()) { | 165 | switch (context.GetCommandType()) { |
| 168 | case IPC::CommandType::Close: { | 166 | case IPC::CommandType::Close: { |
| 169 | IPC::ResponseBuilder rb{context, 2}; | 167 | IPC::ResponseBuilder rb{context, 2}; |