1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 20:28:11 +00:00

Kernel: Remove broken implementation of Unix SHM

This code never worked, as was never used for anything. We can build
a much better SHM implementation on top of TmpFS or similar when we
get to the point when we need one.
This commit is contained in:
Andreas Kling 2020-01-02 12:44:21 +01:00
parent 4fa7146da1
commit 7f04334664
11 changed files with 2 additions and 208 deletions

View file

@ -63,7 +63,6 @@ public:
virtual bool is_seekable() const { return false; }
virtual bool is_inode() const { return false; }
virtual bool is_shared_memory() const { return false; }
virtual bool is_fifo() const { return false; }
virtual bool is_device() const { return false; }
virtual bool is_tty() const { return false; }

View file

@ -6,7 +6,6 @@
#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/TTY/MasterPTY.h>
@ -244,25 +243,6 @@ KResult FileDescription::truncate(off_t length)
return m_file->truncate(length);
}
bool FileDescription::is_shared_memory() const
{
return m_file->is_shared_memory();
}
SharedMemory* FileDescription::shared_memory()
{
if (!is_shared_memory())
return nullptr;
return static_cast<SharedMemory*>(m_file.ptr());
}
const SharedMemory* FileDescription::shared_memory() const
{
if (!is_shared_memory())
return nullptr;
return static_cast<const SharedMemory*>(m_file.ptr());
}
bool FileDescription::is_fifo() const
{
return m_file->is_fifo();

View file

@ -18,7 +18,6 @@ class MasterPTY;
class Process;
class Region;
class CharacterDevice;
class SharedMemory;
class FileDescription : public RefCounted<FileDescription> {
public:
@ -87,10 +86,6 @@ public:
FIFO::Direction fifo_direction() { return m_fifo_direction; }
void set_fifo_direction(Badge<FIFO>, FIFO::Direction direction) { m_fifo_direction = direction; }
bool is_shared_memory() const;
SharedMemory* shared_memory();
const SharedMemory* shared_memory() const;
Optional<KBuffer>& generator_cache() { return m_generator_cache; }
void set_original_inode(Badge<VFS>, NonnullRefPtr<Inode>&& inode) { m_inode = move(inode); }

View file

@ -1,97 +0,0 @@
#include <AK/HashMap.h>
#include <Kernel/FileSystem/SharedMemory.h>
#include <Kernel/Lock.h>
#include <Kernel/Process.h>
#include <Kernel/VM/AnonymousVMObject.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_vmobject = nullptr;
return KSuccess;
}
if (!m_vmobject) {
m_vmobject = AnonymousVMObject::create_with_size(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 (!vmobject())
return KResult(-ENODEV);
return process.allocate_region_with_vmobject(vaddr, size, *vmobject(), offset, name(), prot);
}

View file

@ -1,43 +0,0 @@
#pragma once
#include <AK/String.h>
#include <AK/RefPtr.h>
#include <AK/RefCounted.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/KResult.h>
#include <Kernel/UnixTypes.h>
class AnonymousVMObject;
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;
AnonymousVMObject* vmobject() { return m_vmobject.ptr(); }
const AnonymousVMObject* vmobject() const { return m_vmobject.ptr(); }
uid_t uid() const { return m_uid; }
gid_t gid() const { return m_gid; }
private:
// ^File
virtual bool can_read(const FileDescription&) const override { return true; }
virtual bool can_write(const 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<AnonymousVMObject> m_vmobject;
};