Преглед изворни кода

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").
Ali Mohammad Pur пре 4 година
родитељ
комит
e9feced041
2 измењених фајлова са 26 додато и 0 уклоњено
  1. 23 0
      Kernel/Process.cpp
  2. 3 0
      Kernel/Process.h

+ 23 - 0
Kernel/Process.cpp

@@ -428,6 +428,29 @@ RefPtr<Process> 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);

+ 3 - 0
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<void(const FileDescriptionAndFlags&)>) const;
         void change_each(Function<void(FileDescriptionAndFlags&)>);