mirror of
https://github.com/SerenityOS/serenity
synced 2024-09-06 17:06:31 +00:00
Kernel: Add for_each_vmobject_of_type<T>
This makes iterating over a specific type of VMObjects a bit nicer.
This commit is contained in:
parent
239fd33405
commit
55f61c0004
|
@ -671,9 +671,8 @@ int Process::sys$purge(int mode)
|
|||
NonnullRefPtrVector<PurgeableVMObject> vmobjects;
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
MM.for_each_vmobject([&](auto& vmobject) {
|
||||
if (vmobject.is_purgeable())
|
||||
vmobjects.append(static_cast<PurgeableVMObject&>(vmobject));
|
||||
MM.for_each_vmobject_of_type<PurgeableVMObject>([&](auto& vmobject) {
|
||||
vmobjects.append(vmobject);
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
}
|
||||
|
@ -685,9 +684,8 @@ int Process::sys$purge(int mode)
|
|||
NonnullRefPtrVector<InodeVMObject> vmobjects;
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
MM.for_each_vmobject([&](auto& vmobject) {
|
||||
if (vmobject.is_inode())
|
||||
vmobjects.append(static_cast<InodeVMObject&>(vmobject));
|
||||
MM.for_each_vmobject_of_type<InodeVMObject>([&](auto& vmobject) {
|
||||
vmobjects.append(vmobject);
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -56,4 +56,10 @@ private:
|
|||
virtual bool is_anonymous() const override { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
inline bool is<AnonymousVMObject>(const VMObject& vmobject)
|
||||
{
|
||||
return vmobject.is_anonymous();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -50,4 +50,11 @@ private:
|
|||
|
||||
virtual bool is_contiguous() const override { return true; }
|
||||
};
|
||||
|
||||
template<>
|
||||
inline bool is<ContiguousVMObject>(const VMObject& vmobject)
|
||||
{
|
||||
return vmobject.is_contiguous();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -66,4 +66,10 @@ protected:
|
|||
Bitmap m_dirty_pages;
|
||||
};
|
||||
|
||||
template<>
|
||||
inline bool is<InodeVMObject>(const VMObject& vmobject)
|
||||
{
|
||||
return vmobject.is_inode();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -441,16 +441,13 @@ RefPtr<PhysicalPage> MemoryManager::allocate_user_physical_page(ShouldZeroFill s
|
|||
klog() << "MM: no user physical regions available (?)";
|
||||
}
|
||||
|
||||
for_each_vmobject([&](auto& vmobject) {
|
||||
if (vmobject.is_purgeable()) {
|
||||
auto& purgeable_vmobject = static_cast<PurgeableVMObject&>(vmobject);
|
||||
int purged_page_count = purgeable_vmobject.purge_with_interrupts_disabled({});
|
||||
if (purged_page_count) {
|
||||
klog() << "MM: Purge saved the day! Purged " << purged_page_count << " pages from PurgeableVMObject{" << &purgeable_vmobject << "}";
|
||||
page = find_free_user_physical_page();
|
||||
ASSERT(page);
|
||||
return IterationDecision::Break;
|
||||
}
|
||||
for_each_vmobject_of_type<PurgeableVMObject>([&](auto& vmobject) {
|
||||
int purged_page_count = vmobject.purge_with_interrupts_disabled({});
|
||||
if (purged_page_count) {
|
||||
klog() << "MM: Purge saved the day! Purged " << purged_page_count << " pages from PurgeableVMObject{" << &vmobject << "}";
|
||||
page = find_free_user_physical_page();
|
||||
ASSERT(page);
|
||||
return IterationDecision::Break;
|
||||
}
|
||||
return IterationDecision::Continue;
|
||||
});
|
||||
|
|
|
@ -125,6 +125,17 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
template<typename T, typename Callback>
|
||||
static void for_each_vmobject_of_type(Callback callback)
|
||||
{
|
||||
for (auto& vmobject : MM.m_vmobjects) {
|
||||
if (!is<T>(vmobject))
|
||||
continue;
|
||||
if (callback(static_cast<T&>(vmobject)) == IterationDecision::Break)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static Region* region_from_vaddr(Process&, VirtualAddress);
|
||||
static const Region* region_from_vaddr(const Process&, VirtualAddress);
|
||||
|
||||
|
|
|
@ -64,4 +64,10 @@ private:
|
|||
bool m_volatile { false };
|
||||
};
|
||||
|
||||
template<>
|
||||
inline bool is<PurgeableVMObject>(const VMObject& vmobject)
|
||||
{
|
||||
return vmobject.is_purgeable();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -84,4 +84,14 @@ private:
|
|||
VMObject(VMObject&&) = delete;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
inline bool is(const VMObject&) { return false; }
|
||||
|
||||
template<typename T>
|
||||
inline T& to(VMObject& object)
|
||||
{
|
||||
ASSERT(is<typename RemoveConst<T>::Type>(object));
|
||||
return static_cast<T&>(object);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue