mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 13:37:43 +00:00
Kernel: Implement helper to find multiple Regions in a Range
This commit is contained in:
parent
7874b89426
commit
61f0aa6e75
2 changed files with 26 additions and 0 deletions
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -158,6 +159,27 @@ Region* Space::find_region_containing(const Range& range)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<Region*> Space::find_regions_intersecting(const Range& range)
|
||||||
|
{
|
||||||
|
Vector<Region*> regions = {};
|
||||||
|
size_t total_size_collected = 0;
|
||||||
|
|
||||||
|
ScopedSpinLock lock(m_lock);
|
||||||
|
|
||||||
|
// FIXME: Maybe take the cache from the single lookup?
|
||||||
|
for (auto& region : m_regions) {
|
||||||
|
if (region.range().base() < range.end() && region.range().end() > range.base()) {
|
||||||
|
regions.append(®ion);
|
||||||
|
|
||||||
|
total_size_collected += region.size() - region.range().intersect(range).size();
|
||||||
|
if (total_size_collected == range.size())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return regions;
|
||||||
|
}
|
||||||
|
|
||||||
Region& Space::add_region(NonnullOwnPtr<Region> region)
|
Region& Space::add_region(NonnullOwnPtr<Region> region)
|
||||||
{
|
{
|
||||||
auto* ptr = region.ptr();
|
auto* ptr = region.ptr();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <AK/NonnullOwnPtrVector.h>
|
#include <AK/NonnullOwnPtrVector.h>
|
||||||
|
#include <AK/Vector.h>
|
||||||
#include <AK/WeakPtr.h>
|
#include <AK/WeakPtr.h>
|
||||||
#include <Kernel/UnixTypes.h>
|
#include <Kernel/UnixTypes.h>
|
||||||
#include <Kernel/VM/AllocationStrategy.h>
|
#include <Kernel/VM/AllocationStrategy.h>
|
||||||
|
@ -63,6 +65,8 @@ public:
|
||||||
Region* find_region_from_range(const Range&);
|
Region* find_region_from_range(const Range&);
|
||||||
Region* find_region_containing(const Range&);
|
Region* find_region_containing(const Range&);
|
||||||
|
|
||||||
|
Vector<Region*> find_regions_intersecting(const Range&);
|
||||||
|
|
||||||
bool enforces_syscall_regions() const { return m_enforces_syscall_regions; }
|
bool enforces_syscall_regions() const { return m_enforces_syscall_regions; }
|
||||||
void set_enforces_syscall_regions(bool b) { m_enforces_syscall_regions = b; }
|
void set_enforces_syscall_regions(bool b) { m_enforces_syscall_regions = b; }
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue