Kernel: Implement deletion of SMO objects

This commit is contained in:
2024-05-31 12:27:56 +03:00
parent 0501f3bd99
commit 8bfacb0091
7 changed files with 38 additions and 1 deletions

View File

@@ -21,6 +21,7 @@ namespace Kernel
static SharedMemoryObjectManager& get();
BAN::ErrorOr<Key> create_object(size_t size, PageTable::flags_t);
BAN::ErrorOr<void> delete_object(Key);
BAN::ErrorOr<BAN::UniqPtr<SharedMemoryObject>> map_object(Key, PageTable&, AddressRange);
private:
@@ -29,6 +30,8 @@ namespace Kernel
private:
struct Object : public BAN::RefCounted<Object>
{
~Object();
size_t size;
PageTable::flags_t flags;
BAN::Vector<paddr_t> paddrs;

View File

@@ -159,6 +159,7 @@ namespace Kernel
BAN::ErrorOr<long> sys_msync(void* addr, size_t len, int flags);
BAN::ErrorOr<long> sys_smo_create(size_t len, int prot);
BAN::ErrorOr<long> sys_smo_delete(SharedMemoryObjectManager::Key);
BAN::ErrorOr<long> sys_smo_map(SharedMemoryObjectManager::Key);
BAN::ErrorOr<long> sys_tty_ctrl(int fildes, int command, int flags);

View File

@@ -21,6 +21,13 @@ namespace Kernel
return *s_instance;
}
SharedMemoryObjectManager::Object::~Object()
{
for (auto paddr : paddrs)
if (paddr)
Heap::get().release_page(paddr);
}
BAN::ErrorOr<SharedMemoryObjectManager::Key> SharedMemoryObjectManager::create_object(size_t size, PageTable::flags_t flags)
{
ASSERT(size % PAGE_SIZE == 0);
@@ -43,6 +50,18 @@ namespace Kernel
return key;
}
BAN::ErrorOr<void> SharedMemoryObjectManager::delete_object(Key key)
{
LockGuard _(m_mutex);
auto it = m_objects.find(key);
if (it == m_objects.end())
return BAN::Error::from_errno(ENOENT);
m_objects.remove(it);
return {};
}
BAN::ErrorOr<BAN::UniqPtr<SharedMemoryObject>> SharedMemoryObjectManager::map_object(Key key, PageTable& page_table, AddressRange address_range)
{
LockGuard _(m_mutex);

View File

@@ -1418,6 +1418,12 @@ namespace Kernel
return TRY(SharedMemoryObjectManager::get().create_object(len, page_flags));
}
BAN::ErrorOr<long> Process::sys_smo_delete(SharedMemoryObjectManager::Key key)
{
TRY(SharedMemoryObjectManager::get().delete_object(key));
return 0;
}
BAN::ErrorOr<long> Process::sys_smo_map(SharedMemoryObjectManager::Key key)
{
auto region = TRY(SharedMemoryObjectManager::get().map_object(key, page_table(), { .start = 0x400000, .end = KERNEL_OFFSET }));