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

Kernel: Move SharedMemory.{cpp,h} into FileSystem/

This commit is contained in:
Andreas Kling 2019-07-09 14:50:01 +02:00
parent f4cec2f110
commit 23a6c2086b
5 changed files with 4 additions and 4 deletions

View file

@ -6,9 +6,9 @@
#include <Kernel/FileSystem/FileDescription.h>
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/InodeFile.h>
#include <Kernel/FileSystem/SharedMemory.h>
#include <Kernel/Net/Socket.h>
#include <Kernel/Process.h>
#include <Kernel/SharedMemory.h>
#include <Kernel/TTY/MasterPTY.h>
#include <Kernel/TTY/TTY.h>
#include <Kernel/UnixTypes.h>

View file

@ -0,0 +1,97 @@
#include <AK/HashMap.h>
#include <Kernel/FileSystem/SharedMemory.h>
#include <Kernel/Lock.h>
#include <Kernel/Process.h>
#include <Kernel/VM/VMObject.h>
Lockable<HashMap<String, RefPtr<SharedMemory>>>& shared_memories()
{
static Lockable<HashMap<String, RefPtr<SharedMemory>>>* map;
if (!map)
map = new Lockable<HashMap<String, RefPtr<SharedMemory>>>;
return *map;
}
KResultOr<NonnullRefPtr<SharedMemory>> SharedMemory::open(const String& name, int flags, mode_t mode)
{
UNUSED_PARAM(flags);
LOCKER(shared_memories().lock());
auto it = shared_memories().resource().find(name);
if (it != shared_memories().resource().end()) {
auto shared_memory = it->value;
// FIXME: Improved access checking.
if (shared_memory->uid() != current->process().uid())
return KResult(-EACCES);
return *shared_memory;
}
auto shared_memory = adopt(*new SharedMemory(name, current->process().uid(), current->process().gid(), mode));
shared_memories().resource().set(name, shared_memory.ptr());
return shared_memory;
}
KResult SharedMemory::unlink(const String& name)
{
LOCKER(shared_memories().lock());
auto it = shared_memories().resource().find(name);
if (it == shared_memories().resource().end())
return KResult(-ENOENT);
shared_memories().resource().remove(it);
return KSuccess;
}
SharedMemory::SharedMemory(const String& name, uid_t uid, gid_t gid, mode_t mode)
: m_name(name)
, m_uid(uid)
, m_gid(gid)
, m_mode(mode)
{
}
SharedMemory::~SharedMemory()
{
}
KResult SharedMemory::truncate(int length)
{
if (!length) {
m_vmo = nullptr;
return KSuccess;
}
if (!m_vmo) {
m_vmo = VMObject::create_anonymous(length);
return KSuccess;
}
// FIXME: Support truncation.
ASSERT_NOT_REACHED();
return KResult(-ENOTIMPL);
}
String SharedMemory::absolute_path(const FileDescription&) const
{
return String::format("shm:%u", this);
}
int SharedMemory::read(FileDescription&, u8* buffer, int buffer_size)
{
UNUSED_PARAM(buffer);
UNUSED_PARAM(buffer_size);
// FIXME: Implement.
ASSERT_NOT_REACHED();
}
int SharedMemory::write(FileDescription&, const u8* data, int data_size)
{
UNUSED_PARAM(data);
UNUSED_PARAM(data_size);
// FIXME: Implement.
ASSERT_NOT_REACHED();
}
KResultOr<Region*> SharedMemory::mmap(Process& process, FileDescription&, VirtualAddress vaddr, size_t offset, size_t size, int prot)
{
if (!vmo())
return KResult(-ENODEV);
return process.allocate_region_with_vmo(vaddr, size, *vmo(), offset, name(), prot);
}

View file

@ -0,0 +1,43 @@
#pragma once
#include <AK/AKString.h>
#include <AK/RefPtr.h>
#include <AK/RefCounted.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/KResult.h>
#include <Kernel/UnixTypes.h>
class VMObject;
class SharedMemory : public File {
public:
static KResultOr<NonnullRefPtr<SharedMemory>> open(const String& name, int flags, mode_t);
static KResult unlink(const String& name);
virtual ~SharedMemory() override;
const String& name() const { return m_name; }
virtual KResult truncate(off_t) override;
VMObject* vmo() { return m_vmo.ptr(); }
const VMObject* vmo() const { return m_vmo.ptr(); }
uid_t uid() const { return m_uid; }
gid_t gid() const { return m_gid; }
private:
// ^File
virtual bool can_read(FileDescription&) const override { return true; }
virtual bool can_write(FileDescription&) const override { return true; }
virtual int read(FileDescription&, u8*, int) override;
virtual int write(FileDescription&, const u8*, int) override;
virtual String absolute_path(const FileDescription&) const override;
virtual const char* class_name() const override { return "SharedMemory"; }
virtual bool is_shared_memory() const override { return true; }
virtual KResultOr<Region*> mmap(Process&, FileDescription&, VirtualAddress, size_t offset, size_t size, int prot) override;
SharedMemory(const String& name, uid_t, gid_t, mode_t);
String m_name;
uid_t m_uid { 0 };
gid_t m_gid { 0 };
mode_t m_mode { 0 };
RefPtr<VMObject> m_vmo;
};