summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar Liam2024-01-02 18:29:03 -0500
committerGravatar Liam2024-01-29 20:17:33 -0500
commit182137a9a4b09c8188d2cbffa312550c5dc83641 (patch)
treeaf62d2ecf774e7790c227cb0984e5392deca5afe /src/core/hle/kernel/kernel.cpp
parentam: retrieve main applet creation info from frontend (diff)
downloadyuzu-182137a9a4b09c8188d2cbffa312550c5dc83641.tar.gz
yuzu-182137a9a4b09c8188d2cbffa312550c5dc83641.tar.xz
yuzu-182137a9a4b09c8188d2cbffa312550c5dc83641.zip
am: migrate global state to per-applet state structure
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp30
1 files changed, 14 insertions, 16 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index f3683cdcc..34b25be66 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -97,8 +97,14 @@ struct KernelCore::Impl {
97 RegisterHostThread(nullptr); 97 RegisterHostThread(nullptr);
98 } 98 }
99 99
100 void TerminateApplicationProcess() { 100 void TerminateAllProcesses() {
101 application_process.load()->Terminate(); 101 std::scoped_lock lk{process_list_lock};
102 for (auto& process : process_list) {
103 process->Terminate();
104 process->Close();
105 process = nullptr;
106 }
107 process_list.clear();
102 } 108 }
103 109
104 void Shutdown() { 110 void Shutdown() {
@@ -107,18 +113,9 @@ struct KernelCore::Impl {
107 113
108 CloseServices(); 114 CloseServices();
109 115
110 auto* old_process = application_process.exchange(nullptr); 116 if (application_process) {
111 if (old_process) { 117 application_process->Close();
112 old_process->Close(); 118 application_process = nullptr;
113 }
114
115 {
116 std::scoped_lock lk{process_list_lock};
117 for (auto* const process : process_list) {
118 process->Terminate();
119 process->Close();
120 }
121 process_list.clear();
122 } 119 }
123 120
124 next_object_id = 0; 121 next_object_id = 0;
@@ -354,6 +351,7 @@ struct KernelCore::Impl {
354 351
355 void MakeApplicationProcess(KProcess* process) { 352 void MakeApplicationProcess(KProcess* process) {
356 application_process = process; 353 application_process = process;
354 application_process->Open();
357 } 355 }
358 356
359 static inline thread_local u8 host_thread_id = UINT8_MAX; 357 static inline thread_local u8 host_thread_id = UINT8_MAX;
@@ -779,7 +777,7 @@ struct KernelCore::Impl {
779 // Lists all processes that exist in the current session. 777 // Lists all processes that exist in the current session.
780 std::mutex process_list_lock; 778 std::mutex process_list_lock;
781 std::vector<KProcess*> process_list; 779 std::vector<KProcess*> process_list;
782 std::atomic<KProcess*> application_process{}; 780 KProcess* application_process{};
783 std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context; 781 std::unique_ptr<Kernel::GlobalSchedulerContext> global_scheduler_context;
784 std::unique_ptr<Kernel::KHardwareTimer> hardware_timer; 782 std::unique_ptr<Kernel::KHardwareTimer> hardware_timer;
785 783
@@ -1243,7 +1241,7 @@ void KernelCore::SuspendApplication(bool suspended) {
1243} 1241}
1244 1242
1245void KernelCore::ShutdownCores() { 1243void KernelCore::ShutdownCores() {
1246 impl->TerminateApplicationProcess(); 1244 impl->TerminateAllProcesses();
1247 1245
1248 KScopedSchedulerLock lk{*this}; 1246 KScopedSchedulerLock lk{*this};
1249 1247