diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/hle/kernel/k_event.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/service_thread.cpp | 27 |
2 files changed, 13 insertions, 29 deletions
diff --git a/src/core/hle/kernel/k_event.cpp b/src/core/hle/kernel/k_event.cpp index 27f70e5c5..d973853ab 100644 --- a/src/core/hle/kernel/k_event.cpp +++ b/src/core/hle/kernel/k_event.cpp | |||
| @@ -20,8 +20,12 @@ void KEvent::Initialize(KProcess* owner) { | |||
| 20 | m_readable_event.Initialize(this); | 20 | m_readable_event.Initialize(this); |
| 21 | 21 | ||
| 22 | // Set our owner process. | 22 | // Set our owner process. |
| 23 | m_owner = owner; | 23 | // HACK: this should never be nullptr, but service threads don't have a |
| 24 | m_owner->Open(); | 24 | // proper parent process yet. |
| 25 | if (owner != nullptr) { | ||
| 26 | m_owner = owner; | ||
| 27 | m_owner->Open(); | ||
| 28 | } | ||
| 25 | 29 | ||
| 26 | // Mark initialized. | 30 | // Mark initialized. |
| 27 | m_initialized = true; | 31 | m_initialized = true; |
| @@ -50,8 +54,11 @@ Result KEvent::Clear() { | |||
| 50 | void KEvent::PostDestroy(uintptr_t arg) { | 54 | void KEvent::PostDestroy(uintptr_t arg) { |
| 51 | // Release the event count resource the owner process holds. | 55 | // Release the event count resource the owner process holds. |
| 52 | KProcess* owner = reinterpret_cast<KProcess*>(arg); | 56 | KProcess* owner = reinterpret_cast<KProcess*>(arg); |
| 53 | owner->GetResourceLimit()->Release(LimitableResource::EventCountMax, 1); | 57 | |
| 54 | owner->Close(); | 58 | if (owner != nullptr) { |
| 59 | owner->GetResourceLimit()->Release(LimitableResource::EventCountMax, 1); | ||
| 60 | owner->Close(); | ||
| 61 | } | ||
| 55 | } | 62 | } |
| 56 | 63 | ||
| 57 | } // namespace Kernel | 64 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/service_thread.cpp b/src/core/hle/kernel/service_thread.cpp index f5c2ab23f..e6e41ac34 100644 --- a/src/core/hle/kernel/service_thread.cpp +++ b/src/core/hle/kernel/service_thread.cpp | |||
| @@ -40,7 +40,6 @@ private: | |||
| 40 | std::mutex m_session_mutex; | 40 | std::mutex m_session_mutex; |
| 41 | std::map<KServerSession*, std::shared_ptr<SessionRequestManager>> m_sessions; | 41 | std::map<KServerSession*, std::shared_ptr<SessionRequestManager>> m_sessions; |
| 42 | KEvent* m_wakeup_event; | 42 | KEvent* m_wakeup_event; |
| 43 | KProcess* m_process; | ||
| 44 | KThread* m_thread; | 43 | KThread* m_thread; |
| 45 | std::atomic<bool> m_shutdown_requested; | 44 | std::atomic<bool> m_shutdown_requested; |
| 46 | const std::string m_service_name; | 45 | const std::string m_service_name; |
| @@ -180,39 +179,17 @@ ServiceThread::Impl::~Impl() { | |||
| 180 | 179 | ||
| 181 | // Close thread. | 180 | // Close thread. |
| 182 | m_thread->Close(); | 181 | m_thread->Close(); |
| 183 | |||
| 184 | // Close process. | ||
| 185 | m_process->Close(); | ||
| 186 | } | 182 | } |
| 187 | 183 | ||
| 188 | ServiceThread::Impl::Impl(KernelCore& kernel_, const std::string& service_name) | 184 | ServiceThread::Impl::Impl(KernelCore& kernel_, const std::string& service_name) |
| 189 | : kernel{kernel_}, m_service_name{service_name} { | 185 | : kernel{kernel_}, m_service_name{service_name} { |
| 190 | // Initialize process. | ||
| 191 | m_process = KProcess::Create(kernel); | ||
| 192 | KProcess::Initialize(m_process, kernel.System(), service_name, | ||
| 193 | KProcess::ProcessType::KernelInternal, kernel.GetSystemResourceLimit()); | ||
| 194 | |||
| 195 | // Reserve a new event from the process resource limit | ||
| 196 | KScopedResourceReservation event_reservation(m_process, LimitableResource::EventCountMax); | ||
| 197 | ASSERT(event_reservation.Succeeded()); | ||
| 198 | |||
| 199 | // Initialize event. | 186 | // Initialize event. |
| 200 | m_wakeup_event = KEvent::Create(kernel); | 187 | m_wakeup_event = KEvent::Create(kernel); |
| 201 | m_wakeup_event->Initialize(m_process); | 188 | m_wakeup_event->Initialize(nullptr); |
| 202 | |||
| 203 | // Commit the event reservation. | ||
| 204 | event_reservation.Commit(); | ||
| 205 | |||
| 206 | // Reserve a new thread from the process resource limit | ||
| 207 | KScopedResourceReservation thread_reservation(m_process, LimitableResource::ThreadCountMax); | ||
| 208 | ASSERT(thread_reservation.Succeeded()); | ||
| 209 | 189 | ||
| 210 | // Initialize thread. | 190 | // Initialize thread. |
| 211 | m_thread = KThread::Create(kernel); | 191 | m_thread = KThread::Create(kernel); |
| 212 | ASSERT(KThread::InitializeDummyThread(m_thread, m_process).IsSuccess()); | 192 | ASSERT(KThread::InitializeDummyThread(m_thread, nullptr).IsSuccess()); |
| 213 | |||
| 214 | // Commit the thread reservation. | ||
| 215 | thread_reservation.Commit(); | ||
| 216 | 193 | ||
| 217 | // Start thread. | 194 | // Start thread. |
| 218 | m_host_thread = std::jthread([this] { LoopProcess(); }); | 195 | m_host_thread = std::jthread([this] { LoopProcess(); }); |