Переглянути джерело

Kernel: Add a Process::add_region() helper

This is a private helper for adding a Region to Process::m_regions.
It's just for convenience since it's a bit cumbersome to do this.
Andreas Kling 5 роки тому
батько
коміт
ae0c435e68
2 змінених файлів з 26 додано та 17 видалено
  1. 24 17
      Kernel/Process.cpp
  2. 2 0
      Kernel/Process.h

+ 24 - 17
Kernel/Process.cpp

@@ -167,8 +167,7 @@ static unsigned prot_to_region_access_flags(int prot)
 
 
 Region& Process::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject)
 Region& Process::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject)
 {
 {
-    m_regions.append(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access()));
-    return m_regions.last();
+    return add_region(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access()));
 }
 }
 
 
 Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)
 Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)
@@ -176,11 +175,11 @@ Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String
     auto range = allocate_range(vaddr, size);
     auto range = allocate_range(vaddr, size);
     if (!range.is_valid())
     if (!range.is_valid())
         return nullptr;
         return nullptr;
-    m_regions.append(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(page_directory());
+    auto& region = add_region(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
+    region.map(page_directory());
     if (commit)
     if (commit)
-        m_regions.last().commit();
-    return &m_regions.last();
+        region.commit();
+    return &region;
 }
 }
 
 
 Region* Process::allocate_file_backed_region(VirtualAddress vaddr, size_t size, NonnullRefPtr<Inode> inode, const String& name, int prot)
 Region* Process::allocate_file_backed_region(VirtualAddress vaddr, size_t size, NonnullRefPtr<Inode> inode, const String& name, int prot)
@@ -188,9 +187,9 @@ Region* Process::allocate_file_backed_region(VirtualAddress vaddr, size_t size,
     auto range = allocate_range(vaddr, size);
     auto range = allocate_range(vaddr, size);
     if (!range.is_valid())
     if (!range.is_valid())
         return nullptr;
         return nullptr;
-    m_regions.append(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(page_directory());
-    return &m_regions.last();
+    auto& region = add_region(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
+    region.map(page_directory());
+    return &region;
 }
 }
 
 
 Region* Process::allocate_region_with_vmobject(VirtualAddress vaddr, size_t size, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, const String& name, int prot, bool user_accessible)
 Region* Process::allocate_region_with_vmobject(VirtualAddress vaddr, size_t size, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, const String& name, int prot, bool user_accessible)
@@ -212,12 +211,13 @@ Region* Process::allocate_region_with_vmobject(VirtualAddress vaddr, size_t size
     if (!range.is_valid())
     if (!range.is_valid())
         return nullptr;
         return nullptr;
     offset_in_vmobject &= PAGE_MASK;
     offset_in_vmobject &= PAGE_MASK;
+    Region* region;
     if (user_accessible)
     if (user_accessible)
-        m_regions.append(Region::create_user_accessible(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
+        region = &add_region(Region::create_user_accessible(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
     else
     else
-        m_regions.append(Region::create_kernel_only(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
-    m_regions.last().map(page_directory());
-    return &m_regions.last();
+        region = &add_region(Region::create_kernel_only(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
+    region->map(page_directory());
+    return region;
 }
 }
 
 
 bool Process::deallocate_region(Region& region)
 bool Process::deallocate_region(Region& region)
@@ -225,7 +225,7 @@ bool Process::deallocate_region(Region& region)
     InterruptDisabler disabler;
     InterruptDisabler disabler;
     for (int i = 0; i < m_regions.size(); ++i) {
     for (int i = 0; i < m_regions.size(); ++i) {
         if (&m_regions[i] == &region) {
         if (&m_regions[i] == &region) {
-            m_regions.unstable_remove(i);
+            m_regions.remove(i);
             return true;
             return true;
         }
         }
     }
     }
@@ -640,11 +640,11 @@ pid_t Process::sys$fork(RegisterDump& regs)
 #ifdef FORK_DEBUG
 #ifdef FORK_DEBUG
         dbg() << "fork: cloning Region{" << &region << "} '" << region.name() << "' @ " << region.vaddr();
         dbg() << "fork: cloning Region{" << &region << "} '" << region.name() << "' @ " << region.vaddr();
 #endif
 #endif
-        child->m_regions.append(region.clone());
-        child->m_regions.last().map(child->page_directory());
+        auto& child_region = child->add_region(region.clone());
+        child_region.map(child->page_directory());
 
 
         if (&region == m_master_tls_region)
         if (&region == m_master_tls_region)
-            child->m_master_tls_region = &child->m_regions.last();
+            child->m_master_tls_region = &child_region;
     }
     }
 
 
     child->m_extra_gids = m_extra_gids;
     child->m_extra_gids = m_extra_gids;
@@ -4578,3 +4578,10 @@ int Process::sys$pledge(const Syscall::SC_pledge_params* user_params)
 
 
     return 0;
     return 0;
 }
 }
+
+Region& Process::add_region(NonnullOwnPtr<Region> region)
+{
+    auto* ptr = region.ptr();
+    m_regions.append(move(region));
+    return *ptr;
+}

+ 2 - 0
Kernel/Process.h

@@ -390,6 +390,8 @@ private:
 
 
     Range allocate_range(VirtualAddress, size_t);
     Range allocate_range(VirtualAddress, size_t);
 
 
+    Region& add_region(NonnullOwnPtr<Region>);
+
     int do_exec(NonnullRefPtr<FileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<FileDescription> interpreter_description);
     int do_exec(NonnullRefPtr<FileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<FileDescription> interpreter_description);
     ssize_t do_write(FileDescription&, const u8*, int data_size);
     ssize_t do_write(FileDescription&, const u8*, int data_size);