forked from Bananymous/banan-os
45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include <kernel/FS/Inode.h>
|
|
#include <kernel/Memory/MemoryRegion.h>
|
|
|
|
namespace Kernel
|
|
{
|
|
|
|
struct SharedFileData : public BAN::RefCounted<SharedFileData>, public BAN::Weakable<SharedFileData>
|
|
{
|
|
~SharedFileData();
|
|
|
|
// FIXME: this should probably be ordered tree like map
|
|
// for fast lookup and less memory usage
|
|
BAN::Vector<paddr_t> pages;
|
|
BAN::RefPtr<Inode> inode;
|
|
uint8_t page_buffer[PAGE_SIZE];
|
|
};
|
|
|
|
class FileBackedRegion final : public MemoryRegion
|
|
{
|
|
BAN_NON_COPYABLE(FileBackedRegion);
|
|
BAN_NON_MOVABLE(FileBackedRegion);
|
|
|
|
public:
|
|
static BAN::ErrorOr<BAN::UniqPtr<FileBackedRegion>> create(BAN::RefPtr<Inode>, PageTable&, off_t offset, size_t size, AddressRange address_range, Type, PageTable::flags_t);
|
|
~FileBackedRegion();
|
|
|
|
virtual BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> clone(PageTable& new_page_table) override;
|
|
|
|
protected:
|
|
virtual BAN::ErrorOr<bool> allocate_page_containing_impl(vaddr_t vaddr) override;
|
|
|
|
private:
|
|
FileBackedRegion(BAN::RefPtr<Inode>, PageTable&, off_t offset, ssize_t size, Type flags, PageTable::flags_t page_flags);
|
|
|
|
private:
|
|
BAN::RefPtr<Inode> m_inode;
|
|
const off_t m_offset;
|
|
|
|
// FIXME: is this even synchronized?
|
|
BAN::RefPtr<SharedFileData> m_shared_data;
|
|
};
|
|
|
|
} |