mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-06 19:19:44 +03:00
Kernel: Remove temporary Vector from Ext2FS::flush_writes()
Previously we were using this vector to store the inodes as we iterated. However, we don't need to store all of them, just the previous inode, as we know it will be safe to remove it once we've iterated past that element.
This commit is contained in:
parent
aa77c2ca58
commit
4b4cf06069
Notes:
sideshowbarker
2024-07-17 21:35:52 +09:00
Author: https://github.com/bgianfo Commit: https://github.com/SerenityOS/serenity/commit/4b4cf060692 Pull-request: https://github.com/SerenityOS/serenity/pull/11588
@ -700,26 +700,34 @@ void Ext2FS::flush_writes()
|
||||
// Uncache Inodes that are only kept alive by the index-to-inode lookup cache.
|
||||
// We don't uncache Inodes that are being watched by at least one InodeWatcher.
|
||||
|
||||
Optional<InodeIndex> last_index {};
|
||||
auto remove_previous_entry_from_cache = [&]() {
|
||||
if (last_index.has_value()) {
|
||||
m_inode_cache.remove(last_index.value());
|
||||
last_index.clear();
|
||||
}
|
||||
};
|
||||
|
||||
// FIXME: It would be better to keep a capped number of Inodes around.
|
||||
// The problem is that they are quite heavy objects, and use a lot of heap memory
|
||||
// for their (child name lookup) and (block list) caches.
|
||||
Vector<InodeIndex> unused_inodes;
|
||||
for (auto& it : m_inode_cache) {
|
||||
remove_previous_entry_from_cache();
|
||||
|
||||
// NOTE: If we're asked to look up an inode by number (via get_inode) and it turns out
|
||||
// to not exist, we remember the fact that it doesn't exist by caching a nullptr.
|
||||
// This seems like a reasonable time to uncache ideas about unknown inodes, so do that.
|
||||
if (!it.value) {
|
||||
MUST(unused_inodes.try_append(it.key));
|
||||
last_index = it.key;
|
||||
continue;
|
||||
}
|
||||
if (it.value->ref_count() != 1)
|
||||
continue;
|
||||
if (it.value->has_watchers())
|
||||
continue;
|
||||
MUST(unused_inodes.try_append(it.key));
|
||||
last_index = it.key;
|
||||
}
|
||||
for (auto index : unused_inodes)
|
||||
uncache_inode(index);
|
||||
remove_previous_entry_from_cache();
|
||||
}
|
||||
|
||||
BlockBasedFileSystem::flush_writes();
|
||||
|
Loading…
Reference in New Issue
Block a user