mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 07:38:10 +00:00

We now use AK::Error and AK::ErrorOr<T> in both kernel and userspace! This was a slightly tedious refactoring that took a long time, so it's not unlikely that some bugs crept in. Nevertheless, it does pass basic functionality testing, and it's just real nice to finally see the same pattern in all contexts. :^)
48 lines
1.3 KiB
C++
48 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/RedBlackTree.h>
|
|
#include <AK/Traits.h>
|
|
#include <Kernel/Locking/Spinlock.h>
|
|
#include <Kernel/Memory/VirtualRange.h>
|
|
|
|
namespace Kernel::Memory {
|
|
|
|
class VirtualRangeAllocator {
|
|
public:
|
|
VirtualRangeAllocator();
|
|
~VirtualRangeAllocator() = default;
|
|
|
|
void initialize_with_range(VirtualAddress, size_t);
|
|
void initialize_from_parent(VirtualRangeAllocator const&);
|
|
|
|
ErrorOr<VirtualRange> try_allocate_anywhere(size_t, size_t alignment = PAGE_SIZE);
|
|
ErrorOr<VirtualRange> try_allocate_specific(VirtualAddress, size_t);
|
|
ErrorOr<VirtualRange> try_allocate_randomized(size_t, size_t alignment);
|
|
void deallocate(VirtualRange const&);
|
|
|
|
void dump() const;
|
|
|
|
bool contains(VirtualRange const& range) const { return m_total_range.contains(range); }
|
|
|
|
private:
|
|
void carve_from_region(VirtualRange const& from, VirtualRange const&);
|
|
|
|
RedBlackTree<FlatPtr, VirtualRange> m_available_ranges;
|
|
VirtualRange m_total_range;
|
|
mutable Spinlock m_lock;
|
|
};
|
|
|
|
}
|
|
|
|
namespace AK {
|
|
template<>
|
|
struct Traits<Kernel::Memory::VirtualRange> : public GenericTraits<Kernel::Memory::VirtualRange> {
|
|
static constexpr bool is_trivial() { return true; }
|
|
};
|
|
}
|