/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Kernel { class RangeAllocator { public: RangeAllocator(); ~RangeAllocator() = default; void initialize_with_range(VirtualAddress, size_t); void initialize_from_parent(RangeAllocator const&); Optional allocate_anywhere(size_t, size_t alignment = PAGE_SIZE); Optional allocate_specific(VirtualAddress, size_t); Optional allocate_randomized(size_t, size_t alignment); void deallocate(Range const&); void dump() const; bool contains(Range const& range) const { return m_total_range.contains(range); } private: void carve_at_iterator(auto&, Range const&); RedBlackTree m_available_ranges; Range m_total_range; mutable SpinLock m_lock; }; } namespace AK { template<> struct Traits : public GenericTraits { static constexpr bool is_trivial() { return true; } }; }