mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 18:15:07 +00:00
Kernel/ProcFS: Lazily allocate all sub components of a PID folder
This commit is contained in:
parent
6282df3066
commit
32a4a4ac19
2 changed files with 35 additions and 11 deletions
|
@ -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…
Add table
Add a link
Reference in a new issue