@@ -167,30 +167,29 @@ static unsigned prot_to_region_access_flags(int prot)
167
167
168
168
Region& Process::allocate_split_region (const Region& source_region, const Range& range, size_t offset_in_vmobject)
169
169
{
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 ()));
172
171
}
173
172
174
173
Region* Process::allocate_region (VirtualAddress vaddr, size_t size, const String& name, int prot, bool commit)
175
174
{
176
175
auto range = allocate_range (vaddr, size);
177
176
if (!range.is_valid ())
178
177
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 ());
181
180
if (commit)
182
- m_regions. last () .commit ();
183
- return &m_regions. last () ;
181
+ region .commit ();
182
+ return ®ion ;
184
183
}
185
184
186
185
Region* Process::allocate_file_backed_region (VirtualAddress vaddr, size_t size, NonnullRefPtr<Inode> inode, const String& name, int prot)
187
186
{
188
187
auto range = allocate_range (vaddr, size);
189
188
if (!range.is_valid ())
190
189
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 ®ion ;
194
193
}
195
194
196
195
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
212
211
if (!range.is_valid ())
213
212
return nullptr ;
214
213
offset_in_vmobject &= PAGE_MASK;
214
+ Region* region;
215
215
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)));
217
217
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 ;
221
221
}
222
222
223
223
bool Process::deallocate_region (Region& region)
224
224
{
225
225
InterruptDisabler disabler;
226
226
for (int i = 0 ; i < m_regions.size (); ++i) {
227
227
if (&m_regions[i] == ®ion) {
228
- m_regions.unstable_remove (i);
228
+ m_regions.remove (i);
229
229
return true ;
230
230
}
231
231
}
@@ -640,11 +640,11 @@ pid_t Process::sys$fork(RegisterDump& regs)
640
640
#ifdef FORK_DEBUG
641
641
dbg () << " fork: cloning Region{" << ®ion << " } '" << region.name () << " ' @ " << region.vaddr ();
642
642
#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 ());
645
645
646
646
if (®ion == m_master_tls_region)
647
- child->m_master_tls_region = &child-> m_regions . last () ;
647
+ child->m_master_tls_region = &child_region ;
648
648
}
649
649
650
650
child->m_extra_gids = m_extra_gids;
@@ -4578,3 +4578,10 @@ int Process::sys$pledge(const Syscall::SC_pledge_params* user_params)
4578
4578
4579
4579
return 0 ;
4580
4580
}
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
+ }
0 commit comments