mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:42:44 +00:00 
			
		
		
		
	Kernel: Move ProcFS related overrides in Process to ProcessProcFSTraits
This allows us to 1) let go of the Process when an inode is ref'ing for ProcFSExposedComponent related reasons, and 2) change our ref/unref implementation.
This commit is contained in:
		
							parent
							
								
									748938ea59
								
							
						
					
					
						commit
						2830a0ecda
					
				
					 7 changed files with 143 additions and 61 deletions
				
			
		
							
								
								
									
										72
									
								
								Kernel/ProcessProcFSTraits.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Kernel/ProcessProcFSTraits.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,72 @@ | |||
| /*
 | ||||
|  * Copyright (c) 2021, sin-ack <sin-ack@protonmail.com> | ||||
|  * | ||||
|  * SPDX-License-Identifier: BSD-2-Clause | ||||
|  */ | ||||
| 
 | ||||
| #include <Kernel/FileSystem/ProcFS.h> | ||||
| #include <Kernel/Process.h> | ||||
| 
 | ||||
| namespace Kernel { | ||||
| 
 | ||||
| uid_t Process::ProcessProcFSTraits::owner_user() const | ||||
| { | ||||
|     auto process = m_process.strong_ref(); | ||||
|     if (!process) | ||||
|         return 0; | ||||
| 
 | ||||
|     return process->uid(); | ||||
| } | ||||
| 
 | ||||
| gid_t Process::ProcessProcFSTraits::owner_group() const | ||||
| { | ||||
|     auto process = m_process.strong_ref(); | ||||
|     if (!process) | ||||
|         return 0; | ||||
| 
 | ||||
|     return process->gid(); | ||||
| } | ||||
| 
 | ||||
| InodeIndex Process::ProcessProcFSTraits::component_index() const | ||||
| { | ||||
|     auto process = m_process.strong_ref(); | ||||
|     if (!process) | ||||
|         return {}; | ||||
| 
 | ||||
|     return SegmentedProcFSIndex::build_segmented_index_for_pid_directory(process->pid()); | ||||
| } | ||||
| 
 | ||||
| KResultOr<NonnullRefPtr<Inode>> Process::ProcessProcFSTraits::to_inode(const ProcFS& procfs_instance) const | ||||
| { | ||||
|     auto process = m_process.strong_ref(); | ||||
|     if (!process) | ||||
|         return ESRCH; | ||||
| 
 | ||||
|     auto maybe_inode = ProcFSProcessDirectoryInode::try_create(procfs_instance, process->pid()); | ||||
|     if (maybe_inode.is_error()) | ||||
|         return maybe_inode.error(); | ||||
|     return maybe_inode.release_value(); | ||||
| } | ||||
| 
 | ||||
| KResult Process::ProcessProcFSTraits::traverse_as_directory(unsigned fsid, Function<bool(FileSystem::DirectoryEntryView const&)> callback) const | ||||
| { | ||||
|     auto process = m_process.strong_ref(); | ||||
|     if (!process) | ||||
|         return ESRCH; | ||||
| 
 | ||||
|     callback({ ".", { fsid, SegmentedProcFSIndex::build_segmented_index_for_pid_directory(process->pid()) }, 0 }); | ||||
|     callback({ "..", { fsid, ProcFSComponentRegistry::the().root_directory().component_index() }, 0 }); | ||||
|     callback({ "fd", { fsid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(process->pid(), SegmentedProcFSIndex::ProcessSubDirectory::FileDescriptions) }, 0 }); | ||||
|     callback({ "stacks", { fsid, SegmentedProcFSIndex::build_segmented_index_for_sub_directory(process->pid(), SegmentedProcFSIndex::ProcessSubDirectory::Stacks) }, 0 }); | ||||
|     callback({ "unveil", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::Unveil) }, 0 }); | ||||
|     callback({ "pledge", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::Pledge) }, 0 }); | ||||
|     callback({ "fds", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::FileDescriptions) }, 0 }); | ||||
|     callback({ "exe", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::BinaryLink) }, 0 }); | ||||
|     callback({ "cwd", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::CurrentWorkDirectoryLink) }, 0 }); | ||||
|     callback({ "perf_events", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::PerformanceEvents) }, 0 }); | ||||
|     callback({ "vm", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::VirtualMemoryStats) }, 0 }); | ||||
|     callback({ "root", { fsid, SegmentedProcFSIndex::build_segmented_index_for_main_property_in_pid_directory(process->pid(), SegmentedProcFSIndex::MainProcessProperty::RootLink) }, 0 }); | ||||
|     return KSuccess; | ||||
| } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 sin-ack
						sin-ack