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

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.
This commit is contained in:
Andreas Kling 2019-05-31 15:22:52 +02:00
parent 3fbddcecd2
commit 8adadf8a46
4 changed files with 78 additions and 7 deletions

View file

@ -12,6 +12,35 @@ static Lockable<HashTable<Custody*>>& all_custodies()
return *table;
}
Custody* Custody::get_if_cached(Custody* parent, const String& name)
{
LOCKER(all_custodies().lock());
for (auto& custody : all_custodies().resource()) {
if (custody->is_deleted())
continue;
if (custody->is_mounted_on())
continue;
if (custody->parent() == parent && custody->name() == name)
return custody;
}
return nullptr;
}
Retained<Custody> Custody::get_or_create(Custody* parent, const String& name, Inode& inode)
{
if (RetainPtr<Custody> cached_custody = get_if_cached(parent, name)) {
if (&cached_custody->inode() != &inode) {
dbgprintf("WTF! cached custody for name '%s' has inode=%s, new inode=%s\n",
name.characters(),
cached_custody->inode().identifier().to_string().characters(),
inode.identifier().to_string().characters());
}
ASSERT(&cached_custody->inode() == &inode);
return *cached_custody;
}
return create(parent, name, inode);
}
Custody::Custody(Custody* parent, const String& name, Inode& inode)
: m_parent(parent)
, m_name(name)
@ -39,3 +68,19 @@ String Custody::absolute_path() const
}
return builder.to_string();
}
void Custody::did_delete(Badge<VFS>)
{
m_deleted = true;
}
void Custody::did_mount_on(Badge<VFS>)
{
m_mounted_on = true;
}
void Custody::did_rename(Badge<VFS>, const String& name)
{
m_name = name;
}