From e9feced041e1855327a01c2905a7353031ceaa91 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Mon, 16 Aug 2021 06:32:48 +0430 Subject: [PATCH] Kernel: Add a Process::FileDescriptions::get_if_valid(index) API Note that this is not the same as ::at(index), which has a different precondition ("allocated" vs "valid"). --- Kernel/Process.cpp | 23 +++++++++++++++++++++++ Kernel/Process.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index a3ad914a69..f197cb4f92 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -428,6 +428,29 @@ RefPtr Process::from_pid(ProcessID pid) }); } +const Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(size_t i) const +{ + ScopedSpinLock lock(m_fds_lock); + if (m_fds_metadatas.size() <= i) + return nullptr; + + if (auto& metadata = m_fds_metadatas[i]; metadata.is_valid()) + return &metadata; + + return nullptr; +} +Process::FileDescriptionAndFlags* Process::FileDescriptions::get_if_valid(size_t i) +{ + ScopedSpinLock lock(m_fds_lock); + if (m_fds_metadatas.size() <= i) + return nullptr; + + if (auto& metadata = m_fds_metadatas[i]; metadata.is_valid()) + return &metadata; + + return nullptr; +} + const Process::FileDescriptionAndFlags& Process::FileDescriptions::at(size_t i) const { ScopedSpinLock lock(m_fds_lock); diff --git a/Kernel/Process.h b/Kernel/Process.h index a5d1bc9c1c..6c0d57b58c 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -643,6 +643,9 @@ public: const FileDescriptionAndFlags& at(size_t i) const; FileDescriptionAndFlags& at(size_t i); + FileDescriptionAndFlags const* get_if_valid(size_t i) const; + FileDescriptionAndFlags* get_if_valid(size_t i); + void enumerate(Function) const; void change_each(Function);