ladybird/Kernel/FileSystem/Custody.h
Andreas Kling 8adadf8a46 FileSystem: Reuse existing custodies when possible, and keep them updated.
Walk the custody cache and try to reuse an existing one when possible.
The VFS is responsible for updating them when something happens that would
cause the described relationship to change.

This is definitely not perfect but it does work for the basic scenarios like
renaming and removing directory entries.
2019-05-31 15:22:52 +02:00

47 lines
1.3 KiB
C++

#pragma once
#include <AK/AKString.h>
#include <AK/Badge.h>
#include <AK/RetainPtr.h>
#include <AK/Retainable.h>
class Inode;
class VFS;
// FIXME: Custody needs some locking.
class Custody : public Retainable<Custody> {
public:
static Custody* get_if_cached(Custody* parent, const String& name);
static Retained<Custody> get_or_create(Custody* parent, const String& name, Inode&);
static Retained<Custody> create(Custody* parent, const String& name, Inode& inode)
{
return adopt(*new Custody(parent, name, inode));
}
~Custody();
Custody* parent() { return m_parent.ptr(); }
const Custody* parent() const { return m_parent.ptr(); }
Inode& inode() { return *m_inode; }
const Inode& inode() const { return *m_inode; }
const String& name() const { return m_name; }
String absolute_path() const;
bool is_deleted() const { return m_deleted; }
bool is_mounted_on() const { return m_mounted_on; }
void did_delete(Badge<VFS>);
void did_mount_on(Badge<VFS>);
void did_rename(Badge<VFS>, const String& name);
private:
Custody(Custody* parent, const String& name, Inode&);
RetainPtr<Custody> m_parent;
String m_name;
Retained<Inode> m_inode;
bool m_deleted { false };
bool m_mounted_on { false };
};