1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:27: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:
sin-ack 2021-08-14 12:43:34 +00:00 committed by Andreas Kling
parent 748938ea59
commit 2830a0ecda
7 changed files with 143 additions and 61 deletions

View file

@ -85,10 +85,9 @@ typedef HashMap<FlatPtr, RefPtr<FutexQueue>> FutexQueues;
struct LoadResult;
class Process
: public ProcFSExposedComponent
: public RefCounted<Process>
, public Weakable<Process> {
private:
class ProtectedValues {
public:
ProcessID pid { 0 };
@ -145,6 +144,8 @@ public:
};
public:
class ProcessProcFSTraits;
inline static Process* current()
{
auto current_thread = Processor::current_thread();
@ -549,13 +550,7 @@ private:
void setup_socket_fd(int fd, NonnullRefPtr<FileDescription> description, int type);
public:
// ^ProcFSExposedComponent stats
virtual InodeIndex component_index() const override;
virtual KResultOr<NonnullRefPtr<Inode>> to_inode(const ProcFS& procfs_instance) const override;
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual mode_t required_mode() const override { return 0555; }
virtual uid_t owner_user() const override { return uid(); }
virtual gid_t owner_group() const override { return gid(); }
NonnullRefPtr<ProcessProcFSTraits> procfs_traits() const { return *m_procfs_traits; }
KResult procfs_get_fds_stats(KBufferBuilder& builder) const;
KResult procfs_get_perf_events(KBufferBuilder& builder) const;
KResult procfs_get_unveil_stats(KBufferBuilder& builder) const;
@ -713,6 +708,37 @@ public:
FileDescriptionAndFlags* m_description { nullptr };
};
class ProcessProcFSTraits : public ProcFSExposedComponent {
public:
static KResultOr<NonnullRefPtr<ProcessProcFSTraits>> try_create(Badge<Process>, WeakPtr<Process> process)
{
auto result = adopt_ref_if_nonnull(new (nothrow) ProcessProcFSTraits(process));
if (!result)
return ENOMEM;
return result.release_nonnull();
}
virtual InodeIndex component_index() const override;
virtual KResultOr<NonnullRefPtr<Inode>> to_inode(const ProcFS& procfs_instance) const override;
virtual KResult traverse_as_directory(unsigned, Function<bool(FileSystem::DirectoryEntryView const&)>) const override;
virtual mode_t required_mode() const override { return 0555; }
virtual uid_t owner_user() const override;
virtual gid_t owner_group() const override;
private:
ProcessProcFSTraits(WeakPtr<Process> process)
: m_process(process)
{
}
// NOTE: We need to weakly hold on to the process, because otherwise
// we would be creating a reference cycle.
WeakPtr<Process> m_process;
};
FileDescriptions& fds() { return m_fds; }
const FileDescriptions& fds() const { return m_fds; }
@ -770,9 +796,10 @@ private:
};
Array<CoredumpProperty, 4> m_coredump_properties;
NonnullRefPtrVector<Thread> m_threads_for_coredump;
mutable RefPtr<ProcessProcFSTraits> m_procfs_traits;
static_assert(sizeof(ProtectedValues) < (PAGE_SIZE));
alignas(4096) ProtectedValues m_protected_values;
u8 m_protected_values_padding[PAGE_SIZE - sizeof(ProtectedValues)];