#pragma once #include #include #include class PhysicalPage { friend class MemoryManager; friend class PageDirectory; friend class VMObject; public: PhysicalAddress paddr() const { return m_paddr; } void retain() { ASSERT(m_retain_count); ++m_retain_count; } void release() { ASSERT(m_retain_count); if (!--m_retain_count) { if (m_may_return_to_freelist) return_to_freelist(); else delete this; } } static Retained create_eternal(PhysicalAddress, bool supervisor); static Retained create(PhysicalAddress, bool supervisor); word retain_count() const { return m_retain_count; } private: PhysicalPage(PhysicalAddress paddr, bool supervisor, bool may_return_to_freelist = true); ~PhysicalPage() { } void return_to_freelist(); word m_retain_count { 1 }; bool m_may_return_to_freelist { true }; bool m_supervisor { false }; PhysicalAddress m_paddr; };