1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-30 02:47:35 +00:00

Replace zones with individually tracked physical pages.

It's just a simple struct { ref_count, paddr }.
This will allow me to implement lazy zeroing and COW pages.
This commit is contained in:
Andreas Kling 2018-11-05 10:23:00 +01:00
parent b5c5286ee1
commit 72cdc62155
10 changed files with 161 additions and 127 deletions

View file

@ -32,6 +32,7 @@ public:
RetainPtr(RetainPtr& other) : m_ptr(other.copyRef().leakRef()) { }
RetainPtr(RetainPtr&& other) : m_ptr(other.leakRef()) { }
template<typename U> RetainPtr(RetainPtr<U>&& other) : m_ptr(static_cast<T*>(other.leakRef())) { }
RetainPtr(const RetainPtr& other) : m_ptr(const_cast<RetainPtr&>(other).copyRef().leakRef()) { }
~RetainPtr()
{
clear();
@ -121,6 +122,8 @@ public:
operator bool() { return !!m_ptr; }
bool is_null() const { return !m_ptr; }
private:
T* m_ptr = nullptr;
};

View file

@ -75,6 +75,13 @@ public:
other.m_impl = nullptr;
}
Vector(const Vector& other)
{
ensureCapacity(other.size());
for (size_t i = 0; i < other.size(); ++i)
unchecked_append(other[i]);
}
Vector& operator=(Vector&& other)
{
if (this != &other) {
@ -140,16 +147,22 @@ public:
Vector<T> tmp = move(other);
ensureCapacity(size() + tmp.size());
for (auto&& v : tmp) {
uncheckedAppend(move(v));
unchecked_append(move(v));
}
}
void uncheckedAppend(T&& value)
void unchecked_append(T&& value)
{
new (m_impl->slot(m_impl->m_size)) T(move(value));
++m_impl->m_size;
}
void unchecked_append(const T& value)
{
new (m_impl->slot(m_impl->m_size)) T(value);
++m_impl->m_size;
}
void append(T&& value)
{
ensureCapacity(size() + 1);