summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/server_session.cpp2
-rw-r--r--src/core/hle/kernel/service_thread.cpp28
-rw-r--r--src/core/hle/kernel/service_thread.h3
3 files changed, 22 insertions, 11 deletions
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index ed42452ff..947f4a133 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -34,7 +34,7 @@ ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kern
34 34
35 session->name = std::move(name); 35 session->name = std::move(name);
36 session->parent = std::move(parent); 36 session->parent = std::move(parent);
37 session->service_thread = std::make_unique<ServiceThread>(kernel, 1); 37 session->service_thread = std::make_unique<ServiceThread>(kernel, 1, session->name);
38 38
39 return MakeResult(std::move(session)); 39 return MakeResult(std::move(session));
40} 40}
diff --git a/src/core/hle/kernel/service_thread.cpp b/src/core/hle/kernel/service_thread.cpp
index 4ceb7e56a..1c134777f 100644
--- a/src/core/hle/kernel/service_thread.cpp
+++ b/src/core/hle/kernel/service_thread.cpp
@@ -11,6 +11,7 @@
11 11
12#include "common/assert.h" 12#include "common/assert.h"
13#include "common/scope_exit.h" 13#include "common/scope_exit.h"
14#include "common/thread.h"
14#include "core/core.h" 15#include "core/core.h"
15#include "core/hle/kernel/kernel.h" 16#include "core/hle/kernel/kernel.h"
16#include "core/hle/kernel/server_session.h" 17#include "core/hle/kernel/server_session.h"
@@ -22,7 +23,7 @@ namespace Kernel {
22 23
23class ServiceThread::Impl final { 24class ServiceThread::Impl final {
24public: 25public:
25 explicit Impl(KernelCore& kernel, std::size_t num_threads); 26 explicit Impl(KernelCore& kernel, std::size_t num_threads, const std::string& name);
26 ~Impl(); 27 ~Impl();
27 28
28 void QueueSyncRequest(ServerSession& session, std::shared_ptr<HLERequestContext>&& context); 29 void QueueSyncRequest(ServerSession& session, std::shared_ptr<HLERequestContext>&& context);
@@ -32,12 +33,16 @@ private:
32 std::queue<std::function<void()>> requests; 33 std::queue<std::function<void()>> requests;
33 std::mutex queue_mutex; 34 std::mutex queue_mutex;
34 std::condition_variable condition; 35 std::condition_variable condition;
36 const std::string service_name;
35 bool stop{}; 37 bool stop{};
36}; 38};
37 39
38ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads) { 40ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads, const std::string& name)
41 : service_name{name} {
39 for (std::size_t i = 0; i < num_threads; ++i) 42 for (std::size_t i = 0; i < num_threads; ++i)
40 threads.emplace_back([&] { 43 threads.emplace_back([this, &kernel] {
44 Common::SetCurrentThreadName(std::string{"Hle_" + service_name}.c_str());
45
41 // Wait for first request before trying to acquire a render context 46 // Wait for first request before trying to acquire a render context
42 { 47 {
43 std::unique_lock lock{queue_mutex}; 48 std::unique_lock lock{queue_mutex};
@@ -52,7 +57,7 @@ ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads) {
52 { 57 {
53 std::unique_lock lock{queue_mutex}; 58 std::unique_lock lock{queue_mutex};
54 condition.wait(lock, [this] { return stop || !requests.empty(); }); 59 condition.wait(lock, [this] { return stop || !requests.empty(); });
55 if (stop && requests.empty()) { 60 if (stop || requests.empty()) {
56 return; 61 return;
57 } 62 }
58 task = std::move(requests.front()); 63 task = std::move(requests.front());
@@ -68,9 +73,14 @@ void ServiceThread::Impl::QueueSyncRequest(ServerSession& session,
68 std::shared_ptr<HLERequestContext>&& context) { 73 std::shared_ptr<HLERequestContext>&& context) {
69 { 74 {
70 std::unique_lock lock{queue_mutex}; 75 std::unique_lock lock{queue_mutex};
71 requests.emplace([session{SharedFrom(&session)}, context{std::move(context)}]() { 76
72 session->CompleteSyncRequest(*context); 77 // ServerSession owns the service thread, so we cannot caption a strong pointer here in the
73 return; 78 // event that the ServerSession is terminated.
79 std::weak_ptr<ServerSession> weak_ptr{SharedFrom(&session)};
80 requests.emplace([weak_ptr, context{std::move(context)}]() {
81 if (auto strong_ptr = weak_ptr.lock()) {
82 strong_ptr->CompleteSyncRequest(*context);
83 }
74 }); 84 });
75 } 85 }
76 condition.notify_one(); 86 condition.notify_one();
@@ -87,8 +97,8 @@ ServiceThread::Impl::~Impl() {
87 } 97 }
88} 98}
89 99
90ServiceThread::ServiceThread(KernelCore& kernel, std::size_t num_threads) 100ServiceThread::ServiceThread(KernelCore& kernel, std::size_t num_threads, const std::string& name)
91 : impl{std::make_unique<Impl>(kernel, num_threads)} {} 101 : impl{std::make_unique<Impl>(kernel, num_threads, name)} {}
92 102
93ServiceThread::~ServiceThread() = default; 103ServiceThread::~ServiceThread() = default;
94 104
diff --git a/src/core/hle/kernel/service_thread.h b/src/core/hle/kernel/service_thread.h
index 91ad7ae85..025ab8fb5 100644
--- a/src/core/hle/kernel/service_thread.h
+++ b/src/core/hle/kernel/service_thread.h
@@ -5,6 +5,7 @@
5#pragma once 5#pragma once
6 6
7#include <memory> 7#include <memory>
8#include <string>
8 9
9namespace Kernel { 10namespace Kernel {
10 11
@@ -14,7 +15,7 @@ class ServerSession;
14 15
15class ServiceThread final { 16class ServiceThread final {
16public: 17public:
17 explicit ServiceThread(KernelCore& kernel, std::size_t num_threads); 18 explicit ServiceThread(KernelCore& kernel, std::size_t num_threads, const std::string& name);
18 ~ServiceThread(); 19 ~ServiceThread();
19 20
20 void QueueSyncRequest(ServerSession& session, std::shared_ptr<HLERequestContext>&& context); 21 void QueueSyncRequest(ServerSession& session, std::shared_ptr<HLERequestContext>&& context);