mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-20 01:37:39 +03:00
Kernel/ProcFS: Lazily allocate all sub components of a PID folder
This commit is contained in:
parent
6282df3066
commit
32a4a4ac19
Notes:
sideshowbarker
2024-07-18 11:08:01 +09:00
Author: https://github.com/supercomputer7 Commit: https://github.com/SerenityOS/serenity/commit/32a4a4ac197 Pull-request: https://github.com/SerenityOS/serenity/pull/8241 Issue: https://github.com/SerenityOS/serenity/issues/6948 Issue: https://github.com/SerenityOS/serenity/issues/7445 Issue: https://github.com/SerenityOS/serenity/issues/8331 Reviewed-by: https://github.com/IdanHo Reviewed-by: https://github.com/awesomekling
@ -159,8 +159,11 @@ public:
|
||||
|
||||
virtual uid_t owner_user() const override { return m_associated_process->uid(); }
|
||||
virtual gid_t owner_group() const override { return m_associated_process->gid(); }
|
||||
virtual KResult refresh_data(FileDescription&) const override;
|
||||
virtual RefPtr<ProcFSExposedComponent> lookup(StringView name) override;
|
||||
|
||||
private:
|
||||
void on_attach();
|
||||
IntrusiveListNode<ProcFSProcessFolder, RefPtr<ProcFSProcessFolder>> m_list_node;
|
||||
|
||||
explicit ProcFSProcessFolder(const Process&);
|
||||
|
@ -509,19 +509,40 @@ private:
|
||||
WeakPtr<ProcFSProcessFolder> m_parent_process_directory;
|
||||
};
|
||||
|
||||
void ProcFSProcessFolder::on_attach()
|
||||
{
|
||||
VERIFY(m_components.size() == 0);
|
||||
m_components.append(ProcFSProcessUnveil::create(*this));
|
||||
m_components.append(ProcFSProcessPerformanceEvents::create(*this));
|
||||
m_components.append(ProcFSProcessFileDescriptions::create(*this));
|
||||
m_components.append(ProcFSProcessOverallFileDescriptions::create(*this));
|
||||
m_components.append(ProcFSProcessRoot::create(*this));
|
||||
m_components.append(ProcFSProcessVirtualMemory::create(*this));
|
||||
m_components.append(ProcFSProcessCurrentWorkDirectory::create(*this));
|
||||
m_components.append(ProcFSProcessBinary::create(*this));
|
||||
m_components.append(ProcFSProcessStacks::create(*this));
|
||||
}
|
||||
|
||||
RefPtr<ProcFSExposedComponent> ProcFSProcessFolder::lookup(StringView name)
|
||||
{
|
||||
// Note: we need to allocate all sub components when doing a lookup, because
|
||||
// for some reason, the caller may not call ProcFSInode::attach method before calling this.
|
||||
if (m_components.size() == 0)
|
||||
on_attach();
|
||||
return ProcFSExposedFolder::lookup(name);
|
||||
}
|
||||
|
||||
KResult ProcFSProcessFolder::refresh_data(FileDescription&) const
|
||||
{
|
||||
if (m_components.size() != 0)
|
||||
return KSuccess;
|
||||
const_cast<ProcFSProcessFolder&>(*this).on_attach();
|
||||
return KSuccess;
|
||||
}
|
||||
|
||||
NonnullRefPtr<ProcFSProcessFolder> ProcFSProcessFolder::create(const Process& process)
|
||||
{
|
||||
auto folder = adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull();
|
||||
folder->m_components.append(ProcFSProcessUnveil::create(folder));
|
||||
folder->m_components.append(ProcFSProcessPerformanceEvents::create(folder));
|
||||
folder->m_components.append(ProcFSProcessFileDescriptions::create(folder));
|
||||
folder->m_components.append(ProcFSProcessOverallFileDescriptions::create(folder));
|
||||
folder->m_components.append(ProcFSProcessRoot::create(folder));
|
||||
folder->m_components.append(ProcFSProcessVirtualMemory::create(folder));
|
||||
folder->m_components.append(ProcFSProcessCurrentWorkDirectory::create(folder));
|
||||
folder->m_components.append(ProcFSProcessBinary::create(folder));
|
||||
folder->m_components.append(ProcFSProcessStacks::create(folder));
|
||||
return folder;
|
||||
return adopt_ref_if_nonnull(new (nothrow) ProcFSProcessFolder(process)).release_nonnull();
|
||||
}
|
||||
|
||||
ProcFSProcessFolder::ProcFSProcessFolder(const Process& process)
|
||||
|
Loading…
Reference in New Issue
Block a user