From dcfb1f3eb161c1e096626894667dfd2248893f7d Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 14 Jun 2026 15:28:55 +0200 Subject: kernel/vfs: fix reference cycle for dentries --- kernel/include/kernel/filesystem/dentry.hpp | 4 ++-- kernel/src/filesystem/dentry.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/kernel/include/kernel/filesystem/dentry.hpp b/kernel/include/kernel/filesystem/dentry.hpp index 478596a..096a6bb 100644 --- a/kernel/include/kernel/filesystem/dentry.hpp +++ b/kernel/include/kernel/filesystem/dentry.hpp @@ -46,7 +46,7 @@ namespace kernel::filesystem @brief Get the parent dentry. @return A reference to the parent dentry. */ - [[nodiscard]] auto parent() const -> kstd::shared_ptr const &; + [[nodiscard]] auto parent() const -> kstd::shared_ptr; /** @brief Get the name of the dentry. @@ -94,7 +94,7 @@ namespace kernel::filesystem private: kstd::string m_name; - kstd::shared_ptr m_parent; + kstd::weak_ptr m_parent; kstd::vector> m_children; kstd::shared_ptr m_inode; uint32_t m_flags; diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp index 3d8e01a..01de276 100644 --- a/kernel/src/filesystem/dentry.cpp +++ b/kernel/src/filesystem/dentry.cpp @@ -34,9 +34,9 @@ namespace kernel::filesystem return m_inode; } - auto dentry::parent() const -> kstd::shared_ptr const & + auto dentry::parent() const -> kstd::shared_ptr { - return m_parent; + return m_parent.lock(); } auto dentry::name() const -> std::string_view @@ -48,7 +48,7 @@ namespace kernel::filesystem { kstd::string path = m_name; - auto parent = m_parent; + auto parent = this->parent(); while (parent) { auto parent_name = parent->m_name; @@ -61,7 +61,7 @@ namespace kernel::filesystem path = parent_name + "/" + path; } - parent = parent->m_parent; + parent = parent->parent(); } return path; -- cgit v1.2.3 From 672ed2067f48f3a1d6d6f8a6f97c4e76cc664bc3 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 14 Jun 2026 15:29:19 +0200 Subject: kstd/memory: fix self-referential shared_ptr deallocation --- libs/kstd/kstd/bits/shared_ptr.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/kstd/kstd/bits/shared_ptr.hpp b/libs/kstd/kstd/bits/shared_ptr.hpp index 8930095..57a89c0 100644 --- a/libs/kstd/kstd/bits/shared_ptr.hpp +++ b/libs/kstd/kstd/bits/shared_ptr.hpp @@ -21,7 +21,7 @@ namespace kstd std::atomic shared_count; std::atomic weak_count; - explicit shared_control_block(std::size_t shared = 1, std::size_t weak = 0) + explicit shared_control_block(std::size_t shared = 1, std::size_t weak = 1) : shared_count(shared) , weak_count(weak) {} @@ -146,7 +146,7 @@ namespace kstd { if (control != nullptr) { - if (--(control->weak_count) == 0 && control->shared_count == 0) + if (--(control->weak_count) == 0) { delete control; } @@ -579,7 +579,7 @@ namespace kstd delete pointer; pointer = nullptr; - if (control->weak_count == 0) + if (--(control->weak_count) == 0) { delete control; } -- cgit v1.2.3