|
|
|
@ -51,7 +51,8 @@ namespace Kernel { |
|
|
|
|
|
|
|
struct KernelCore::Impl { |
|
|
|
explicit Impl(Core::System& system_, KernelCore& kernel_) |
|
|
|
: time_manager{system_}, object_list_container{kernel_}, system{system_} {} |
|
|
|
: time_manager{system_}, object_list_container{kernel_}, |
|
|
|
service_threads_manager{1, "yuzu:ServiceThreadsManager"}, system{system_} {} |
|
|
|
|
|
|
|
void SetMulticore(bool is_multi) { |
|
|
|
is_multicore = is_multi; |
|
|
|
@ -707,24 +708,22 @@ struct KernelCore::Impl { |
|
|
|
std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, |
|
|
|
const std::string& name) { |
|
|
|
auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); |
|
|
|
{ |
|
|
|
std::lock_guard lk(service_threads_lock); |
|
|
|
service_threads.emplace(service_thread); |
|
|
|
} |
|
|
|
|
|
|
|
service_threads_manager.QueueWork( |
|
|
|
[this, service_thread]() { service_threads.emplace(service_thread); }); |
|
|
|
|
|
|
|
return service_thread; |
|
|
|
} |
|
|
|
|
|
|
|
void ReleaseServiceThread(std::weak_ptr<Kernel::ServiceThread> service_thread) { |
|
|
|
auto strong_ptr = service_thread.lock(); |
|
|
|
{ |
|
|
|
std::lock_guard lk(service_threads_lock); |
|
|
|
service_threads.erase(strong_ptr); |
|
|
|
if (auto strong_ptr = service_thread.lock()) { |
|
|
|
service_threads_manager.QueueWork( |
|
|
|
[this, strong_ptr{std::move(strong_ptr)}]() { service_threads.erase(strong_ptr); }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void ClearServiceThreads() { |
|
|
|
std::lock_guard lk(service_threads_lock); |
|
|
|
service_threads.clear(); |
|
|
|
service_threads_manager.QueueWork([this]() { service_threads.clear(); }); |
|
|
|
} |
|
|
|
|
|
|
|
std::mutex server_ports_lock; |
|
|
|
@ -732,7 +731,6 @@ struct KernelCore::Impl { |
|
|
|
std::mutex registered_objects_lock; |
|
|
|
std::mutex registered_in_use_objects_lock; |
|
|
|
std::mutex dummy_thread_lock; |
|
|
|
std::mutex service_threads_lock; |
|
|
|
|
|
|
|
std::atomic<u32> next_object_id{0}; |
|
|
|
std::atomic<u64> next_kernel_process_id{KProcess::InitialKIPIDMin}; |
|
|
|
@ -783,6 +781,7 @@ struct KernelCore::Impl { |
|
|
|
|
|
|
|
// Threads used for services
|
|
|
|
std::unordered_set<std::shared_ptr<Kernel::ServiceThread>> service_threads; |
|
|
|
Common::ThreadWorker service_threads_manager; |
|
|
|
|
|
|
|
std::array<KThread*, Core::Hardware::NUM_CPU_CORES> suspend_threads; |
|
|
|
std::array<Core::CPUInterruptHandler, Core::Hardware::NUM_CPU_CORES> interrupts{}; |
|
|
|
|