diff options
| -rw-r--r-- | src/core/hle/kernel/server_session.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/service_thread.cpp | 28 | ||||
| -rw-r--r-- | src/core/hle/kernel/service_thread.h | 3 |
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 | ||
| 23 | class ServiceThread::Impl final { | 24 | class ServiceThread::Impl final { |
| 24 | public: | 25 | public: |
| 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 | ||
| 38 | ServiceThread::Impl::Impl(KernelCore& kernel, std::size_t num_threads) { | 40 | ServiceThread::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 | ||
| 90 | ServiceThread::ServiceThread(KernelCore& kernel, std::size_t num_threads) | 100 | ServiceThread::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 | ||
| 93 | ServiceThread::~ServiceThread() = default; | 103 | ServiceThread::~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 | ||
| 9 | namespace Kernel { | 10 | namespace Kernel { |
| 10 | 11 | ||
| @@ -14,7 +15,7 @@ class ServerSession; | |||
| 14 | 15 | ||
| 15 | class ServiceThread final { | 16 | class ServiceThread final { |
| 16 | public: | 17 | public: |
| 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); |