Skip to content

Commit ae0c435

Browse files
committed
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.
1 parent 1dc9fa9 commit ae0c435

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

Kernel/Process.cpp

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -167,30 +167,29 @@ static unsigned prot_to_region_access_flags(int prot)
167167

168168
Region& Process::allocate_split_region(const Region& source_region, const Range& range, size_t offset_in_vmobject)
169169
{
170-
m_regions.append(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access()));
171-
return m_regions.last();
170+
return add_region(Region::create_user_accessible(range, source_region.vmobject(), offset_in_vmobject, source_region.name(), source_region.access()));
172171
}
173172

174173
Region* Process::allocate_region(VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)
175174
{
176175
auto range = allocate_range(vaddr, size);
177176
if (!range.is_valid())
178177
return nullptr;
179-
m_regions.append(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
180-
m_regions.last().map(page_directory());
178+
auto& region = add_region(Region::create_user_accessible(range, name, prot_to_region_access_flags(prot)));
179+
region.map(page_directory());
181180
if (commit)
182-
m_regions.last().commit();
183-
return &m_regions.last();
181+
region.commit();
182+
return &region;
184183
}
185184

186185
Region* Process::allocate_file_backed_region(VirtualAddress vaddr, size_t size, NonnullRefPtr<Inode> inode, const String& name, int prot)
187186
{
188187
auto range = allocate_range(vaddr, size);
189188
if (!range.is_valid())
190189
return nullptr;
191-
m_regions.append(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
192-
m_regions.last().map(page_directory());
193-
return &m_regions.last();
190+
auto& region = add_region(Region::create_user_accessible(range, inode, name, prot_to_region_access_flags(prot)));
191+
region.map(page_directory());
192+
return &region;
194193
}
195194

196195
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,20 +211,21 @@ Region* Process::allocate_region_with_vmobject(VirtualAddress vaddr, size_t size
212211
if (!range.is_valid())
213212
return nullptr;
214213
offset_in_vmobject &= PAGE_MASK;
214+
Region* region;
215215
if (user_accessible)
216-
m_regions.append(Region::create_user_accessible(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
216+
region = &add_region(Region::create_user_accessible(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
217217
else
218-
m_regions.append(Region::create_kernel_only(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
219-
m_regions.last().map(page_directory());
220-
return &m_regions.last();
218+
region = &add_region(Region::create_kernel_only(range, move(vmobject), offset_in_vmobject, name, prot_to_region_access_flags(prot)));
219+
region->map(page_directory());
220+
return region;
221221
}
222222

223223
bool Process::deallocate_region(Region& region)
224224
{
225225
InterruptDisabler disabler;
226226
for (int i = 0; i < m_regions.size(); ++i) {
227227
if (&m_regions[i] == &region) {
228-
m_regions.unstable_remove(i);
228+
m_regions.remove(i);
229229
return true;
230230
}
231231
}
@@ -640,11 +640,11 @@ pid_t Process::sys$fork(RegisterDump& regs)
640640
#ifdef FORK_DEBUG
641641
dbg() << "fork: cloning Region{" << &region << "} '" << region.name() << "' @ " << region.vaddr();
642642
#endif
643-
child->m_regions.append(region.clone());
644-
child->m_regions.last().map(child->page_directory());
643+
auto& child_region = child->add_region(region.clone());
644+
child_region.map(child->page_directory());
645645

646646
if (&region == m_master_tls_region)
647-
child->m_master_tls_region = &child->m_regions.last();
647+
child->m_master_tls_region = &child_region;
648648
}
649649

650650
child->m_extra_gids = m_extra_gids;
@@ -4578,3 +4578,10 @@ int Process::sys$pledge(const Syscall::SC_pledge_params* user_params)
45784578

45794579
return 0;
45804580
}
4581+
4582+
Region& Process::add_region(NonnullOwnPtr<Region> region)
4583+
{
4584+
auto* ptr = region.ptr();
4585+
m_regions.append(move(region));
4586+
return *ptr;
4587+
}

Kernel/Process.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,8 @@ class Process : public InlineLinkedListNode<Process>
390390

391391
Range allocate_range(VirtualAddress, size_t);
392392

393+
Region& add_region(NonnullOwnPtr<Region>);
394+
393395
int do_exec(NonnullRefPtr<FileDescription> main_program_description, Vector<String> arguments, Vector<String> environment, RefPtr<FileDescription> interpreter_description);
394396
ssize_t do_write(FileDescription&, const u8*, int data_size);
395397

0 commit comments

Comments
 (0)