summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/kernel/k_event.cpp15
-rw-r--r--src/core/hle/kernel/service_thread.cpp27
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() {
50void KEvent::PostDestroy(uintptr_t arg) { 54void 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
188ServiceThread::Impl::Impl(KernelCore& kernel_, const std::string& service_name) 184ServiceThread::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(); });