/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Kernel { class ProcFSProcessPropertyInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: static ErrorOr> try_create_for_file_description_link(ProcFS const&, unsigned, ProcessID); static ErrorOr> try_create_for_thread_stack(ProcFS const&, ThreadID, ProcessID); static ErrorOr> try_create_for_pid_property(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); static ErrorOr> try_create_for_child_process_link(ProcFS const&, ProcessID, ProcessID); private: ProcFSProcessPropertyInode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); ProcFSProcessPropertyInode(ProcFS const&, ThreadID, ProcessID); ProcFSProcessPropertyInode(ProcFS const&, unsigned, ProcessID); ProcFSProcessPropertyInode(ProcFS const&, ProcessID, ProcessID); // ^Inode virtual ErrorOr attach(OpenFileDescription& description) override; virtual void did_seek(OpenFileDescription&, off_t) override; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr read_bytes_locked(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final; virtual ErrorOr> lookup(StringView name) override final; ErrorOr refresh_data(OpenFileDescription& description); ErrorOr try_to_acquire_data(Process& process, KBufferBuilder& builder) const; const SegmentedProcFSIndex::ProcessSubDirectory m_parent_sub_directory_type; union { SegmentedProcFSIndex::MainProcessProperty property_type; unsigned property_index; } m_possible_data; mutable Mutex m_refresh_lock; }; }