mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:42:43 +00:00 
			
		
		
		
	Kernel: Stop using *LockRefPtr for Process pointers
The only persistent one of these was Thread::m_process and that never changes after initialization. Make it const to enforce this and switch everything over to RefPtr & NonnullRefPtr.
This commit is contained in:
		
							parent
							
								
									19084ef743
								
							
						
					
					
						commit
						65438d8a85
					
				
					 11 changed files with 42 additions and 42 deletions
				
			
		|  | @ -52,7 +52,7 @@ bool Coredump::FlatRegionData::is_consistent_with_region(Memory::Region const& r | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullLockRefPtr<Process> process, StringView output_path) | ErrorOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullRefPtr<Process> process, StringView output_path) | ||||||
| { | { | ||||||
|     if (!process->is_dumpable()) { |     if (!process->is_dumpable()) { | ||||||
|         dbgln("Refusing to generate coredump for non-dumpable process {}", process->pid().value()); |         dbgln("Refusing to generate coredump for non-dumpable process {}", process->pid().value()); | ||||||
|  | @ -74,7 +74,7 @@ ErrorOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullLockRefPtr<Process> | ||||||
|     return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description), move(regions))); |     return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description), move(regions))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Coredump::Coredump(NonnullLockRefPtr<Process> process, NonnullRefPtr<OpenFileDescription> description, Vector<FlatRegionData> regions) | Coredump::Coredump(NonnullRefPtr<Process> process, NonnullRefPtr<OpenFileDescription> description, Vector<FlatRegionData> regions) | ||||||
|     : m_process(move(process)) |     : m_process(move(process)) | ||||||
|     , m_description(move(description)) |     , m_description(move(description)) | ||||||
|     , m_regions(move(regions)) |     , m_regions(move(regions)) | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ namespace Kernel { | ||||||
| 
 | 
 | ||||||
| class Coredump { | class Coredump { | ||||||
| public: | public: | ||||||
|     static ErrorOr<NonnullOwnPtr<Coredump>> try_create(NonnullLockRefPtr<Process>, StringView output_path); |     static ErrorOr<NonnullOwnPtr<Coredump>> try_create(NonnullRefPtr<Process>, StringView output_path); | ||||||
|     static SpinlockProtected<OwnPtr<KString>, LockRank::None>& directory_path(); |     static SpinlockProtected<OwnPtr<KString>, LockRank::None>& directory_path(); | ||||||
| 
 | 
 | ||||||
|     ~Coredump() = default; |     ~Coredump() = default; | ||||||
|  | @ -65,7 +65,7 @@ private: | ||||||
|         VirtualAddress m_vaddr; |         VirtualAddress m_vaddr; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     Coredump(NonnullLockRefPtr<Process>, NonnullRefPtr<OpenFileDescription>, Vector<FlatRegionData>); |     Coredump(NonnullRefPtr<Process>, NonnullRefPtr<OpenFileDescription>, Vector<FlatRegionData>); | ||||||
|     static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path); |     static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path); | ||||||
| 
 | 
 | ||||||
|     ErrorOr<void> write_elf_header(); |     ErrorOr<void> write_elf_header(); | ||||||
|  | @ -79,7 +79,7 @@ private: | ||||||
|     ErrorOr<void> create_notes_regions_data(auto&) const; |     ErrorOr<void> create_notes_regions_data(auto&) const; | ||||||
|     ErrorOr<void> create_notes_metadata_data(auto&) const; |     ErrorOr<void> create_notes_metadata_data(auto&) const; | ||||||
| 
 | 
 | ||||||
|     NonnullLockRefPtr<Process> m_process; |     NonnullRefPtr<Process> const m_process; | ||||||
|     NonnullRefPtr<OpenFileDescription> m_description; |     NonnullRefPtr<OpenFileDescription> m_description; | ||||||
|     size_t m_num_program_headers { 0 }; |     size_t m_num_program_headers { 0 }; | ||||||
|     Vector<FlatRegionData> m_regions; |     Vector<FlatRegionData> m_regions; | ||||||
|  |  | ||||||
|  | @ -149,7 +149,7 @@ private: | ||||||
|     AsyncDeviceSubRequestList m_sub_requests_pending; |     AsyncDeviceSubRequestList m_sub_requests_pending; | ||||||
|     AsyncDeviceSubRequestList m_sub_requests_complete; |     AsyncDeviceSubRequestList m_sub_requests_complete; | ||||||
|     WaitQueue m_queue; |     WaitQueue m_queue; | ||||||
|     NonnullLockRefPtr<Process> m_process; |     NonnullRefPtr<Process> const m_process; | ||||||
|     void* m_private { nullptr }; |     void* m_private { nullptr }; | ||||||
|     mutable Spinlock<LockRank::None> m_lock {}; |     mutable Spinlock<LockRank::None> m_lock {}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -288,7 +288,7 @@ static ErrorOr<void> build_from_cached_data(KBufferBuilder& builder, ProcFSInode | ||||||
|     return {}; |     return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<void> ProcFSInode::try_fetch_process_property_data(NonnullLockRefPtr<Process> process, KBufferBuilder& builder) const | ErrorOr<void> ProcFSInode::try_fetch_process_property_data(NonnullRefPtr<Process> process, KBufferBuilder& builder) const | ||||||
| { | { | ||||||
|     VERIFY(m_type == Type::ProcessProperty); |     VERIFY(m_type == Type::ProcessProperty); | ||||||
|     if (m_subdirectory == process_fd_subdirectory_root_entry.subdirectory) { |     if (m_subdirectory == process_fd_subdirectory_root_entry.subdirectory) { | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ private: | ||||||
|     virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override final; |     virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override final; | ||||||
| 
 | 
 | ||||||
|     ErrorOr<void> refresh_process_property_data(OpenFileDescription& description); |     ErrorOr<void> refresh_process_property_data(OpenFileDescription& description); | ||||||
|     ErrorOr<void> try_fetch_process_property_data(NonnullLockRefPtr<Process>, KBufferBuilder& builder) const; |     ErrorOr<void> try_fetch_process_property_data(NonnullRefPtr<Process>, KBufferBuilder& builder) const; | ||||||
| 
 | 
 | ||||||
|     Type m_type; |     Type m_type; | ||||||
|     Optional<ProcessID> const m_associated_pid {}; |     Optional<ProcessID> const m_associated_pid {}; | ||||||
|  |  | ||||||
|  | @ -202,13 +202,13 @@ void Process::kill_all_threads() | ||||||
| void Process::register_new(Process& process) | void Process::register_new(Process& process) | ||||||
| { | { | ||||||
|     // Note: this is essentially the same like process->ref()
 |     // Note: this is essentially the same like process->ref()
 | ||||||
|     LockRefPtr<Process> new_process = process; |     NonnullRefPtr<Process> const new_process = process; | ||||||
|     all_instances().with([&](auto& list) { |     all_instances().with([&](auto& list) { | ||||||
|         list.prepend(process); |         list.prepend(process); | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<NonnullLockRefPtr<Process>> Process::try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID uid, GroupID gid, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, TTY* tty) | ErrorOr<NonnullRefPtr<Process>> Process::try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID uid, GroupID gid, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, TTY* tty) | ||||||
| { | { | ||||||
|     auto parts = path.split_view('/'); |     auto parts = path.split_view('/'); | ||||||
|     if (arguments.is_empty()) { |     if (arguments.is_empty()) { | ||||||
|  | @ -257,7 +257,7 @@ ErrorOr<NonnullLockRefPtr<Process>> Process::try_create_user_process(LockRefPtr< | ||||||
|     return process; |     return process; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LockRefPtr<Process> Process::create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register) | RefPtr<Process> Process::create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register) | ||||||
| { | { | ||||||
|     auto process_or_error = Process::try_create(first_thread, move(name), UserID(0), GroupID(0), ProcessID(0), true); |     auto process_or_error = Process::try_create(first_thread, move(name), UserID(0), GroupID(0), ProcessID(0), true); | ||||||
|     if (process_or_error.is_error()) |     if (process_or_error.is_error()) | ||||||
|  | @ -289,7 +289,7 @@ void Process::unprotect_data() | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<NonnullLockRefPtr<Process>> Process::try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, Process* fork_parent) | ErrorOr<NonnullRefPtr<Process>> Process::try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, Process* fork_parent) | ||||||
| { | { | ||||||
|     OwnPtr<Memory::AddressSpace> new_address_space; |     OwnPtr<Memory::AddressSpace> new_address_space; | ||||||
|     if (fork_parent) { |     if (fork_parent) { | ||||||
|  | @ -303,7 +303,7 @@ ErrorOr<NonnullLockRefPtr<Process>> Process::try_create(LockRefPtr<Thread>& firs | ||||||
|     auto unveil_tree = UnveilNode { TRY(KString::try_create("/"sv)), UnveilMetadata(TRY(KString::try_create("/"sv))) }; |     auto unveil_tree = UnveilNode { TRY(KString::try_create("/"sv)), UnveilMetadata(TRY(KString::try_create("/"sv))) }; | ||||||
|     auto exec_unveil_tree = UnveilNode { TRY(KString::try_create("/"sv)), UnveilMetadata(TRY(KString::try_create("/"sv))) }; |     auto exec_unveil_tree = UnveilNode { TRY(KString::try_create("/"sv)), UnveilMetadata(TRY(KString::try_create("/"sv))) }; | ||||||
|     auto credentials = TRY(Credentials::create(uid, gid, uid, gid, uid, gid, {}, fork_parent ? fork_parent->sid() : 0, fork_parent ? fork_parent->pgid() : 0)); |     auto credentials = TRY(Credentials::create(uid, gid, uid, gid, uid, gid, {}, fork_parent ? fork_parent->sid() : 0, fork_parent ? fork_parent->pgid() : 0)); | ||||||
|     auto process = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Process(move(name), move(credentials), ppid, is_kernel_process, move(current_directory), move(executable), tty, move(unveil_tree), move(exec_unveil_tree)))); |     auto process = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Process(move(name), move(credentials), ppid, is_kernel_process, move(current_directory), move(executable), tty, move(unveil_tree), move(exec_unveil_tree)))); | ||||||
|     TRY(process->attach_resources(new_address_space.release_nonnull(), first_thread, fork_parent)); |     TRY(process->attach_resources(new_address_space.release_nonnull(), first_thread, fork_parent)); | ||||||
|     return process; |     return process; | ||||||
| } | } | ||||||
|  | @ -491,11 +491,11 @@ void Process::crash(int signal, Optional<RegisterState const&> regs, bool out_of | ||||||
|     VERIFY_NOT_REACHED(); |     VERIFY_NOT_REACHED(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LockRefPtr<Process> Process::from_pid_in_same_jail(ProcessID pid) | RefPtr<Process> Process::from_pid_in_same_jail(ProcessID pid) | ||||||
| { | { | ||||||
|     return Process::current().m_jail_process_list.with([&](auto const& list_ptr) -> LockRefPtr<Process> { |     return Process::current().m_jail_process_list.with([&](auto const& list_ptr) -> RefPtr<Process> { | ||||||
|         if (list_ptr) { |         if (list_ptr) { | ||||||
|             return list_ptr->attached_processes().with([&](auto const& list) -> LockRefPtr<Process> { |             return list_ptr->attached_processes().with([&](auto const& list) -> RefPtr<Process> { | ||||||
|                 for (auto& process : list) { |                 for (auto& process : list) { | ||||||
|                     if (process.pid() == pid) { |                     if (process.pid() == pid) { | ||||||
|                         return process; |                         return process; | ||||||
|  | @ -504,7 +504,7 @@ LockRefPtr<Process> Process::from_pid_in_same_jail(ProcessID pid) | ||||||
|                 return {}; |                 return {}; | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|         return all_instances().with([&](auto const& list) -> LockRefPtr<Process> { |         return all_instances().with([&](auto const& list) -> RefPtr<Process> { | ||||||
|             for (auto& process : list) { |             for (auto& process : list) { | ||||||
|                 if (process.pid() == pid) { |                 if (process.pid() == pid) { | ||||||
|                     return process; |                     return process; | ||||||
|  | @ -515,9 +515,9 @@ LockRefPtr<Process> Process::from_pid_in_same_jail(ProcessID pid) | ||||||
|     }); |     }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LockRefPtr<Process> Process::from_pid_ignoring_jails(ProcessID pid) | RefPtr<Process> Process::from_pid_ignoring_jails(ProcessID pid) | ||||||
| { | { | ||||||
|     return all_instances().with([&](auto const& list) -> LockRefPtr<Process> { |     return all_instances().with([&](auto const& list) -> RefPtr<Process> { | ||||||
|         for (auto const& process : list) { |         for (auto const& process : list) { | ||||||
|             if (process.pid() == pid) |             if (process.pid() == pid) | ||||||
|                 return &process; |                 return &process; | ||||||
|  | @ -812,7 +812,7 @@ void Process::disowned_by_waiter(Process& process) | ||||||
| 
 | 
 | ||||||
| void Process::unblock_waiters(Thread::WaitBlocker::UnblockFlags flags, u8 signal) | void Process::unblock_waiters(Thread::WaitBlocker::UnblockFlags flags, u8 signal) | ||||||
| { | { | ||||||
|     LockRefPtr<Process> waiter_process; |     RefPtr<Process> waiter_process; | ||||||
|     if (auto* my_tracer = tracer()) |     if (auto* my_tracer = tracer()) | ||||||
|         waiter_process = Process::from_pid_ignoring_jails(my_tracer->tracer_pid()); |         waiter_process = Process::from_pid_ignoring_jails(my_tracer->tracer_pid()); | ||||||
|     else |     else | ||||||
|  |  | ||||||
|  | @ -186,14 +186,14 @@ public: | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     template<typename EntryFunction> |     template<typename EntryFunction> | ||||||
|     static LockRefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes) |     static RefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes) | ||||||
|     { |     { | ||||||
|         auto* entry_func = new EntryFunction(move(entry)); |         auto* entry_func = new EntryFunction(move(entry)); | ||||||
|         return create_kernel_process(first_thread, move(name), &Process::kernel_process_trampoline<EntryFunction>, entry_func, affinity, do_register); |         return create_kernel_process(first_thread, move(name), &Process::kernel_process_trampoline<EntryFunction>, entry_func, affinity, do_register); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     static LockRefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes); |     static RefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes); | ||||||
|     static ErrorOr<NonnullLockRefPtr<Process>> try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID, GroupID, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, TTY*); |     static ErrorOr<NonnullRefPtr<Process>> try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID, GroupID, Vector<NonnullOwnPtr<KString>> arguments, Vector<NonnullOwnPtr<KString>> environment, TTY*); | ||||||
|     static void register_new(Process&); |     static void register_new(Process&); | ||||||
| 
 | 
 | ||||||
|     ~Process(); |     ~Process(); | ||||||
|  | @ -215,8 +215,8 @@ public: | ||||||
|     bool is_kernel_process() const { return m_is_kernel_process; } |     bool is_kernel_process() const { return m_is_kernel_process; } | ||||||
|     bool is_user_process() const { return !m_is_kernel_process; } |     bool is_user_process() const { return !m_is_kernel_process; } | ||||||
| 
 | 
 | ||||||
|     static LockRefPtr<Process> from_pid_in_same_jail(ProcessID); |     static RefPtr<Process> from_pid_in_same_jail(ProcessID); | ||||||
|     static LockRefPtr<Process> from_pid_ignoring_jails(ProcessID); |     static RefPtr<Process> from_pid_ignoring_jails(ProcessID); | ||||||
|     static SessionID get_sid_from_pgid(ProcessGroupID pgid); |     static SessionID get_sid_from_pgid(ProcessGroupID pgid); | ||||||
| 
 | 
 | ||||||
|     SpinlockProtected<NonnullOwnPtr<KString>, LockRank::None> const& name() const; |     SpinlockProtected<NonnullOwnPtr<KString>, LockRank::None> const& name() const; | ||||||
|  | @ -594,7 +594,7 @@ private: | ||||||
|     bool remove_thread(Thread&); |     bool remove_thread(Thread&); | ||||||
| 
 | 
 | ||||||
|     Process(NonnullOwnPtr<KString> name, NonnullRefPtr<Credentials>, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, UnveilNode unveil_tree, UnveilNode exec_unveil_tree); |     Process(NonnullOwnPtr<KString> name, NonnullRefPtr<Credentials>, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, UnveilNode unveil_tree, UnveilNode exec_unveil_tree); | ||||||
|     static ErrorOr<NonnullLockRefPtr<Process>> try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); |     static ErrorOr<NonnullRefPtr<Process>> try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); | ||||||
|     ErrorOr<void> attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, LockRefPtr<Thread>& first_thread, Process* fork_parent); |     ErrorOr<void> attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, LockRefPtr<Thread>& first_thread, Process* fork_parent); | ||||||
|     static ProcessID allocate_pid(); |     static ProcessID allocate_pid(); | ||||||
| 
 | 
 | ||||||
|  | @ -617,7 +617,7 @@ private: | ||||||
|     ErrorOr<void> do_killall(int signal); |     ErrorOr<void> do_killall(int signal); | ||||||
|     ErrorOr<void> do_killself(int signal); |     ErrorOr<void> do_killself(int signal); | ||||||
| 
 | 
 | ||||||
|     ErrorOr<siginfo_t> do_waitid(Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options); |     ErrorOr<siginfo_t> do_waitid(Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options); | ||||||
| 
 | 
 | ||||||
|     static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Userspace<char const*> user_path, size_t path_length); |     static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Userspace<char const*> user_path, size_t path_length); | ||||||
|     static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Syscall::StringArgument const&); |     static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Syscall::StringArgument const&); | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
| 
 | 
 | ||||||
| namespace Kernel { | namespace Kernel { | ||||||
| 
 | 
 | ||||||
| ErrorOr<siginfo_t> Process::do_waitid(Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options) | ErrorOr<siginfo_t> Process::do_waitid(Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options) | ||||||
| { | { | ||||||
|     ErrorOr<siginfo_t> result = siginfo_t {}; |     ErrorOr<siginfo_t> result = siginfo_t {}; | ||||||
|     if (Thread::current()->block<Thread::WaitBlocker>({}, options, move(waitee), result).was_interrupted()) |     if (Thread::current()->block<Thread::WaitBlocker>({}, options, move(waitee), result).was_interrupted()) | ||||||
|  | @ -25,7 +25,7 @@ ErrorOr<FlatPtr> Process::sys$waitid(Userspace<Syscall::SC_waitid_params const*> | ||||||
|     TRY(require_promise(Pledge::proc)); |     TRY(require_promise(Pledge::proc)); | ||||||
|     auto params = TRY(copy_typed_from_user(user_params)); |     auto params = TRY(copy_typed_from_user(user_params)); | ||||||
| 
 | 
 | ||||||
|     Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee; |     Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee; | ||||||
|     switch (params.idtype) { |     switch (params.idtype) { | ||||||
|     case P_ALL: |     case P_ALL: | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|  | @ -39,7 +39,7 @@ SpinlockProtected<Thread::GlobalList, LockRank::None>& Thread::all_instances() | ||||||
|     return *s_list; |     return *s_list; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<NonnullLockRefPtr<Thread>> Thread::try_create(NonnullLockRefPtr<Process> process) | ErrorOr<NonnullLockRefPtr<Thread>> Thread::try_create(NonnullRefPtr<Process> process) | ||||||
| { | { | ||||||
|     auto kernel_stack_region = TRY(MM.allocate_kernel_region(default_kernel_stack_size, {}, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow)); |     auto kernel_stack_region = TRY(MM.allocate_kernel_region(default_kernel_stack_size, {}, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow)); | ||||||
|     kernel_stack_region->set_stack(true); |     kernel_stack_region->set_stack(true); | ||||||
|  | @ -50,7 +50,7 @@ ErrorOr<NonnullLockRefPtr<Thread>> Thread::try_create(NonnullLockRefPtr<Process> | ||||||
|     return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Thread(move(process), move(kernel_stack_region), move(block_timer), move(name))); |     return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Thread(move(process), move(kernel_stack_region), move(block_timer), move(name))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Thread::Thread(NonnullLockRefPtr<Process> process, NonnullOwnPtr<Memory::Region> kernel_stack_region, NonnullLockRefPtr<Timer> block_timer, NonnullOwnPtr<KString> name) | Thread::Thread(NonnullRefPtr<Process> process, NonnullOwnPtr<Memory::Region> kernel_stack_region, NonnullLockRefPtr<Timer> block_timer, NonnullOwnPtr<KString> name) | ||||||
|     : m_process(move(process)) |     : m_process(move(process)) | ||||||
|     , m_kernel_stack_region(move(kernel_stack_region)) |     , m_kernel_stack_region(move(kernel_stack_region)) | ||||||
|     , m_name(move(name)) |     , m_name(move(name)) | ||||||
|  | @ -596,7 +596,7 @@ void Thread::finalize_dying_threads() | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     for (auto* thread : dying_threads) { |     for (auto* thread : dying_threads) { | ||||||
|         LockRefPtr<Process> process = thread->process(); |         RefPtr<Process> const process = thread->process(); | ||||||
|         dbgln_if(PROCESS_DEBUG, "Before finalization, {} has {} refs and its process has {}", |         dbgln_if(PROCESS_DEBUG, "Before finalization, {} has {} refs and its process has {}", | ||||||
|             *thread, thread->ref_count(), thread->process().ref_count()); |             *thread, thread->ref_count(), thread->process().ref_count()); | ||||||
|         thread->finalize(); |         thread->finalize(); | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ public: | ||||||
|         return Processor::current_thread(); |         return Processor::current_thread(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     static ErrorOr<NonnullLockRefPtr<Thread>> try_create(NonnullLockRefPtr<Process>); |     static ErrorOr<NonnullLockRefPtr<Thread>> try_create(NonnullRefPtr<Process>); | ||||||
|     ~Thread(); |     ~Thread(); | ||||||
| 
 | 
 | ||||||
|     static LockRefPtr<Thread> from_tid(ThreadID); |     static LockRefPtr<Thread> from_tid(ThreadID); | ||||||
|  | @ -644,7 +644,7 @@ public: | ||||||
|             Disowned |             Disowned | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         WaitBlocker(int wait_options, Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result); |         WaitBlocker(int wait_options, Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result); | ||||||
|         virtual StringView state_string() const override { return "Waiting"sv; } |         virtual StringView state_string() const override { return "Waiting"sv; } | ||||||
|         virtual Type blocker_type() const override { return Type::Wait; } |         virtual Type blocker_type() const override { return Type::Wait; } | ||||||
|         virtual void will_unblock_immediately_without_blocking(UnblockImmediatelyReason) override; |         virtual void will_unblock_immediately_without_blocking(UnblockImmediatelyReason) override; | ||||||
|  | @ -660,7 +660,7 @@ public: | ||||||
| 
 | 
 | ||||||
|         int const m_wait_options; |         int const m_wait_options; | ||||||
|         ErrorOr<siginfo_t>& m_result; |         ErrorOr<siginfo_t>& m_result; | ||||||
|         Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> m_waitee; |         Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> const m_waitee; | ||||||
|         bool m_did_unblock { false }; |         bool m_did_unblock { false }; | ||||||
|         bool m_got_sigchild { false }; |         bool m_got_sigchild { false }; | ||||||
|     }; |     }; | ||||||
|  | @ -684,12 +684,12 @@ public: | ||||||
| 
 | 
 | ||||||
|     private: |     private: | ||||||
|         struct ProcessBlockInfo { |         struct ProcessBlockInfo { | ||||||
|             NonnullLockRefPtr<Process> process; |             NonnullRefPtr<Process> const process; | ||||||
|             WaitBlocker::UnblockFlags flags; |             WaitBlocker::UnblockFlags flags; | ||||||
|             u8 signal; |             u8 signal; | ||||||
|             bool was_waited { false }; |             bool was_waited { false }; | ||||||
| 
 | 
 | ||||||
|             explicit ProcessBlockInfo(NonnullLockRefPtr<Process>&&, WaitBlocker::UnblockFlags, u8); |             explicit ProcessBlockInfo(NonnullRefPtr<Process>&&, WaitBlocker::UnblockFlags, u8); | ||||||
|             ~ProcessBlockInfo(); |             ~ProcessBlockInfo(); | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  | @ -1083,7 +1083,7 @@ public: | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     Thread(NonnullLockRefPtr<Process>, NonnullOwnPtr<Memory::Region>, NonnullLockRefPtr<Timer>, NonnullOwnPtr<KString>); |     Thread(NonnullRefPtr<Process>, NonnullOwnPtr<Memory::Region>, NonnullLockRefPtr<Timer>, NonnullOwnPtr<KString>); | ||||||
| 
 | 
 | ||||||
|     BlockResult block_impl(BlockTimeout const&, Blocker&); |     BlockResult block_impl(BlockTimeout const&, Blocker&); | ||||||
| 
 | 
 | ||||||
|  | @ -1154,7 +1154,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     mutable RecursiveSpinlock<LockRank::Thread> m_lock {}; |     mutable RecursiveSpinlock<LockRank::Thread> m_lock {}; | ||||||
|     mutable RecursiveSpinlock<LockRank::None> m_block_lock {}; |     mutable RecursiveSpinlock<LockRank::None> m_block_lock {}; | ||||||
|     NonnullLockRefPtr<Process> m_process; |     NonnullRefPtr<Process> const m_process; | ||||||
|     ThreadID m_tid { -1 }; |     ThreadID m_tid { -1 }; | ||||||
|     ThreadRegisters m_regs {}; |     ThreadRegisters m_regs {}; | ||||||
|     DebugRegisterState m_debug_register_state {}; |     DebugRegisterState m_debug_register_state {}; | ||||||
|  |  | ||||||
|  | @ -510,7 +510,7 @@ bool Thread::SignalBlocker::check_pending_signals(bool from_add_blocker) | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Thread::WaitBlockerSet::ProcessBlockInfo::ProcessBlockInfo(NonnullLockRefPtr<Process>&& process, WaitBlocker::UnblockFlags flags, u8 signal) | Thread::WaitBlockerSet::ProcessBlockInfo::ProcessBlockInfo(NonnullRefPtr<Process>&& process, WaitBlocker::UnblockFlags flags, u8 signal) | ||||||
|     : process(move(process)) |     : process(move(process)) | ||||||
|     , flags(flags) |     , flags(flags) | ||||||
|     , signal(signal) |     , signal(signal) | ||||||
|  | @ -663,7 +663,7 @@ void Thread::WaitBlockerSet::finalize() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Thread::WaitBlocker::WaitBlocker(int wait_options, Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result) | Thread::WaitBlocker::WaitBlocker(int wait_options, Variant<Empty, NonnullRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result) | ||||||
|     : m_wait_options(wait_options) |     : m_wait_options(wait_options) | ||||||
|     , m_result(result) |     , m_result(result) | ||||||
|     , m_waitee(move(waitee)) |     , m_waitee(move(waitee)) | ||||||
|  | @ -731,7 +731,7 @@ bool Thread::WaitBlocker::unblock(Process& process, UnblockFlags flags, u8 signa | ||||||
|     VERIFY(flags != UnblockFlags::Terminated || signal == 0); // signal argument should be ignored for Terminated
 |     VERIFY(flags != UnblockFlags::Terminated || signal == 0); // signal argument should be ignored for Terminated
 | ||||||
| 
 | 
 | ||||||
|     bool do_not_unblock = m_waitee.visit( |     bool do_not_unblock = m_waitee.visit( | ||||||
|         [&](NonnullLockRefPtr<Process> const& waitee_process) { |         [&](NonnullRefPtr<Process> const& waitee_process) { | ||||||
|             return &process != waitee_process; |             return &process != waitee_process; | ||||||
|         }, |         }, | ||||||
|         [&](NonnullLockRefPtr<ProcessGroup> const& waitee_process_group) { |         [&](NonnullLockRefPtr<ProcessGroup> const& waitee_process_group) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling