mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	kernel: match calls to Register and Unregister
This commit is contained in:
		@@ -293,6 +293,7 @@ struct System::Impl {
 | 
			
		||||
        ASSERT(Kernel::KProcess::Initialize(main_process, system, "main",
 | 
			
		||||
                                            Kernel::KProcess::ProcessType::Userland, resource_limit)
 | 
			
		||||
                   .IsSuccess());
 | 
			
		||||
        Kernel::KProcess::Register(system.Kernel(), main_process);
 | 
			
		||||
        kernel.MakeApplicationProcess(main_process);
 | 
			
		||||
        const auto [load_result, load_parameters] = app_loader->Load(*main_process, system);
 | 
			
		||||
        if (load_result != Loader::ResultStatus::Success) {
 | 
			
		||||
 
 | 
			
		||||
@@ -182,8 +182,8 @@ public:
 | 
			
		||||
    explicit KAutoObjectWithList(KernelCore& kernel) : KAutoObject(kernel) {}
 | 
			
		||||
 | 
			
		||||
    static int Compare(const KAutoObjectWithList& lhs, const KAutoObjectWithList& rhs) {
 | 
			
		||||
        const u64 lid = lhs.GetId();
 | 
			
		||||
        const u64 rid = rhs.GetId();
 | 
			
		||||
        const uintptr_t lid = reinterpret_cast<uintptr_t>(std::addressof(lhs));
 | 
			
		||||
        const uintptr_t rid = reinterpret_cast<uintptr_t>(std::addressof(rhs));
 | 
			
		||||
 | 
			
		||||
        if (lid < rid) {
 | 
			
		||||
            return -1;
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,7 @@ struct KernelCore::Impl {
 | 
			
		||||
                                       pt_heap_region.GetSize());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        InitializeHackSharedMemory();
 | 
			
		||||
        InitializeHackSharedMemory(kernel);
 | 
			
		||||
        RegisterHostThread(nullptr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -216,10 +216,12 @@ struct KernelCore::Impl {
 | 
			
		||||
            auto* main_thread{Kernel::KThread::Create(system.Kernel())};
 | 
			
		||||
            main_thread->SetCurrentCore(core);
 | 
			
		||||
            ASSERT(Kernel::KThread::InitializeMainThread(system, main_thread, core).IsSuccess());
 | 
			
		||||
            KThread::Register(system.Kernel(), main_thread);
 | 
			
		||||
 | 
			
		||||
            auto* idle_thread{Kernel::KThread::Create(system.Kernel())};
 | 
			
		||||
            idle_thread->SetCurrentCore(core);
 | 
			
		||||
            ASSERT(Kernel::KThread::InitializeIdleThread(system, idle_thread, core).IsSuccess());
 | 
			
		||||
            KThread::Register(system.Kernel(), idle_thread);
 | 
			
		||||
 | 
			
		||||
            schedulers[i]->Initialize(main_thread, idle_thread, core);
 | 
			
		||||
        }
 | 
			
		||||
@@ -230,6 +232,7 @@ struct KernelCore::Impl {
 | 
			
		||||
                                       const Core::Timing::CoreTiming& core_timing) {
 | 
			
		||||
        system_resource_limit = KResourceLimit::Create(system.Kernel());
 | 
			
		||||
        system_resource_limit->Initialize(&core_timing);
 | 
			
		||||
        KResourceLimit::Register(kernel, system_resource_limit);
 | 
			
		||||
 | 
			
		||||
        const auto sizes{memory_layout->GetTotalAndKernelMemorySizes()};
 | 
			
		||||
        const auto total_size{sizes.first};
 | 
			
		||||
@@ -355,6 +358,7 @@ struct KernelCore::Impl {
 | 
			
		||||
            ASSERT(KThread::InitializeHighPriorityThread(system, shutdown_threads[core_id], {}, {},
 | 
			
		||||
                                                         core_id)
 | 
			
		||||
                       .IsSuccess());
 | 
			
		||||
            KThread::Register(system.Kernel(), shutdown_threads[core_id]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -729,7 +733,7 @@ struct KernelCore::Impl {
 | 
			
		||||
        memory_manager->Initialize(management_region.GetAddress(), management_region.GetSize());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void InitializeHackSharedMemory() {
 | 
			
		||||
    void InitializeHackSharedMemory(KernelCore& kernel) {
 | 
			
		||||
        // Setup memory regions for emulated processes
 | 
			
		||||
        // TODO(bunnei): These should not be hardcoded regions initialized within the kernel
 | 
			
		||||
        constexpr std::size_t hid_size{0x40000};
 | 
			
		||||
@@ -746,14 +750,23 @@ struct KernelCore::Impl {
 | 
			
		||||
 | 
			
		||||
        hid_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None,
 | 
			
		||||
                                   Svc::MemoryPermission::Read, hid_size);
 | 
			
		||||
        KSharedMemory::Register(kernel, hid_shared_mem);
 | 
			
		||||
 | 
			
		||||
        font_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None,
 | 
			
		||||
                                    Svc::MemoryPermission::Read, font_size);
 | 
			
		||||
        KSharedMemory::Register(kernel, font_shared_mem);
 | 
			
		||||
 | 
			
		||||
        irs_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None,
 | 
			
		||||
                                   Svc::MemoryPermission::Read, irs_size);
 | 
			
		||||
        KSharedMemory::Register(kernel, irs_shared_mem);
 | 
			
		||||
 | 
			
		||||
        time_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None,
 | 
			
		||||
                                    Svc::MemoryPermission::Read, time_size);
 | 
			
		||||
        KSharedMemory::Register(kernel, time_shared_mem);
 | 
			
		||||
 | 
			
		||||
        hidbus_shared_mem->Initialize(system.DeviceMemory(), nullptr, Svc::MemoryPermission::None,
 | 
			
		||||
                                      Svc::MemoryPermission::Read, hidbus_size);
 | 
			
		||||
        KSharedMemory::Register(kernel, hidbus_shared_mem);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::mutex registered_objects_lock;
 | 
			
		||||
@@ -1072,12 +1085,15 @@ static std::jthread RunHostThreadFunc(KernelCore& kernel, KProcess* process,
 | 
			
		||||
    // Commit the thread reservation.
 | 
			
		||||
    thread_reservation.Commit();
 | 
			
		||||
 | 
			
		||||
    // Register the thread.
 | 
			
		||||
    KThread::Register(kernel, thread);
 | 
			
		||||
 | 
			
		||||
    return std::jthread(
 | 
			
		||||
        [&kernel, thread, thread_name{std::move(thread_name)}, func{std::move(func)}] {
 | 
			
		||||
            // Set the thread name.
 | 
			
		||||
            Common::SetCurrentThreadName(thread_name.c_str());
 | 
			
		||||
 | 
			
		||||
            // Register the thread.
 | 
			
		||||
            // Set the thread as current.
 | 
			
		||||
            kernel.RegisterHostThread(thread);
 | 
			
		||||
 | 
			
		||||
            // Run the callback.
 | 
			
		||||
@@ -1099,6 +1115,9 @@ std::jthread KernelCore::RunOnHostCoreProcess(std::string&& process_name,
 | 
			
		||||
    // Ensure that we don't hold onto any extra references.
 | 
			
		||||
    SCOPE_EXIT({ process->Close(); });
 | 
			
		||||
 | 
			
		||||
    // Register the new process.
 | 
			
		||||
    KProcess::Register(*this, process);
 | 
			
		||||
 | 
			
		||||
    // Run the host thread.
 | 
			
		||||
    return RunHostThreadFunc(*this, process, std::move(process_name), std::move(func));
 | 
			
		||||
}
 | 
			
		||||
@@ -1124,6 +1143,9 @@ void KernelCore::RunOnGuestCoreProcess(std::string&& process_name, std::function
 | 
			
		||||
    // Ensure that we don't hold onto any extra references.
 | 
			
		||||
    SCOPE_EXIT({ process->Close(); });
 | 
			
		||||
 | 
			
		||||
    // Register the new process.
 | 
			
		||||
    KProcess::Register(*this, process);
 | 
			
		||||
 | 
			
		||||
    // Reserve a new thread from the process resource limit.
 | 
			
		||||
    KScopedResourceReservation thread_reservation(process, LimitableResource::ThreadCountMax);
 | 
			
		||||
    ASSERT(thread_reservation.Succeeded());
 | 
			
		||||
@@ -1136,6 +1158,9 @@ void KernelCore::RunOnGuestCoreProcess(std::string&& process_name, std::function
 | 
			
		||||
    // Commit the thread reservation.
 | 
			
		||||
    thread_reservation.Commit();
 | 
			
		||||
 | 
			
		||||
    // Register the new thread.
 | 
			
		||||
    KThread::Register(*this, thread);
 | 
			
		||||
 | 
			
		||||
    // Begin running the thread.
 | 
			
		||||
    ASSERT(R_SUCCEEDED(thread->Run()));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -156,6 +156,7 @@ public:
 | 
			
		||||
 | 
			
		||||
            auto* session = Kernel::KSession::Create(kernel);
 | 
			
		||||
            session->Initialize(nullptr, 0);
 | 
			
		||||
            Kernel::KSession::Register(kernel, session);
 | 
			
		||||
 | 
			
		||||
            auto next_manager = std::make_shared<Service::SessionRequestManager>(
 | 
			
		||||
                kernel, manager->GetServerManager());
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,9 @@ ServiceContext::ServiceContext(Core::System& system_, std::string name_)
 | 
			
		||||
                                        Kernel::KProcess::ProcessType::KernelInternal,
 | 
			
		||||
                                        kernel.GetSystemResourceLimit())
 | 
			
		||||
               .IsSuccess());
 | 
			
		||||
 | 
			
		||||
    // Register the process.
 | 
			
		||||
    Kernel::KProcess::Register(kernel, process);
 | 
			
		||||
    process_created = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,9 @@ Mutex::Mutex(Core::System& system) : m_system(system) {
 | 
			
		||||
    m_event = Kernel::KEvent::Create(system.Kernel());
 | 
			
		||||
    m_event->Initialize(nullptr);
 | 
			
		||||
 | 
			
		||||
    // Register the event.
 | 
			
		||||
    Kernel::KEvent::Register(system.Kernel(), m_event);
 | 
			
		||||
 | 
			
		||||
    ASSERT(R_SUCCEEDED(m_event->Signal()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,9 @@ ServerManager::ServerManager(Core::System& system) : m_system{system}, m_serve_m
 | 
			
		||||
    // Initialize event.
 | 
			
		||||
    m_event = Kernel::KEvent::Create(system.Kernel());
 | 
			
		||||
    m_event->Initialize(nullptr);
 | 
			
		||||
 | 
			
		||||
    // Register event.
 | 
			
		||||
    Kernel::KEvent::Register(system.Kernel(), m_event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ServerManager::~ServerManager() {
 | 
			
		||||
@@ -160,6 +163,9 @@ Result ServerManager::ManageDeferral(Kernel::KEvent** out_event) {
 | 
			
		||||
    // Initialize the event.
 | 
			
		||||
    m_deferral_event->Initialize(nullptr);
 | 
			
		||||
 | 
			
		||||
    // Register the event.
 | 
			
		||||
    Kernel::KEvent::Register(m_system.Kernel(), m_deferral_event);
 | 
			
		||||
 | 
			
		||||
    // Set the output.
 | 
			
		||||
    *out_event = m_deferral_event;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,9 @@ Result ServiceManager::RegisterService(std::string name, u32 max_sessions,
 | 
			
		||||
    auto* port = Kernel::KPort::Create(kernel);
 | 
			
		||||
    port->Initialize(ServerSessionCountMax, false, 0);
 | 
			
		||||
 | 
			
		||||
    // Register the port.
 | 
			
		||||
    Kernel::KPort::Register(kernel, port);
 | 
			
		||||
 | 
			
		||||
    service_ports.emplace(name, port);
 | 
			
		||||
    registered_services.emplace(name, handler);
 | 
			
		||||
    if (deferral_event) {
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,9 @@ void Controller::CloneCurrentObject(HLERequestContext& ctx) {
 | 
			
		||||
    // Commit the session reservation.
 | 
			
		||||
    session_reservation.Commit();
 | 
			
		||||
 | 
			
		||||
    // Register the session.
 | 
			
		||||
    Kernel::KSession::Register(system.Kernel(), session);
 | 
			
		||||
 | 
			
		||||
    // Register with server manager.
 | 
			
		||||
    session_manager->GetServerManager().RegisterSession(&session->GetServerSession(),
 | 
			
		||||
                                                        session_manager);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user