diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-06-02 10:54:17 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-06-02 16:30:20 +0200 |
| commit | d2d4fa3330a09f421b8658c077166cc493532b9e (patch) | |
| tree | 985c1cc9564e98d3d640008d95680cd2b8894310 /kernel/include | |
| parent | ad2319188269331f4873adbeb44380d63e8e83c5 (diff) | |
| download | kernel-d2d4fa3330a09f421b8658c077166cc493532b9e.tar.xz kernel-d2d4fa3330a09f421b8658c077166cc493532b9e.zip | |
kernel/vfs: extract fs type registry
Diffstat (limited to 'kernel/include')
| -rw-r--r-- | kernel/include/kernel/filesystem/type.hpp | 9 | ||||
| -rw-r--r-- | kernel/include/kernel/filesystem/type_registry.hpp | 47 | ||||
| -rw-r--r-- | kernel/include/kernel/filesystem/vfs.hpp | 5 |
3 files changed, 56 insertions, 5 deletions
diff --git a/kernel/include/kernel/filesystem/type.hpp b/kernel/include/kernel/filesystem/type.hpp index 87e466b..0948e54 100644 --- a/kernel/include/kernel/filesystem/type.hpp +++ b/kernel/include/kernel/filesystem/type.hpp @@ -28,6 +28,15 @@ namespace kernel::filesystem [[nodiscard]] virtual auto make_instance() const -> kstd::shared_ptr<filesystem> = 0; }; + template<typename Type> + struct type_registration + { + constexpr auto static instance = Type{}; + [[using gnu: section("fs_types"), used, visibility("hidden")]] constexpr auto static pointer{ + kstd::make_observer<type const>(&instance), + }; + }; + } // namespace kernel::filesystem #endif diff --git a/kernel/include/kernel/filesystem/type_registry.hpp b/kernel/include/kernel/filesystem/type_registry.hpp new file mode 100644 index 0000000..2f5e708 --- /dev/null +++ b/kernel/include/kernel/filesystem/type_registry.hpp @@ -0,0 +1,47 @@ +#ifndef TEACH_OS_KERNEL_TYPE_REGISRY_HPP +#define TEACH_OS_KERNEL_TYPE_REGISRY_HPP + +#include <kernel/filesystem/type.hpp> + +#include <kstd/flat_map> +#include <kstd/memory> +#include <kstd/string> + +#include <span> +#include <string_view> + +namespace kernel::filesystem +{ + + struct type_registry + { + using value_type = type; + using pointer = kstd::observer_ptr<value_type const>; + + auto static init() -> void; + auto static get() -> type_registry &; + + constexpr type_registry() noexcept = default; + + //! Add a type descriptor to this registry. + //! + //! This function will register the given descriptor with this registry, given that no descriptor for a filesystem + //! with the same name exists in this registry already. + //! + //! @param descriptor The filesystem type descriptor to add to the registry. + //! @return @p true iff. the descriptor was successfully added, @p false if not. + auto add(pointer descriptor) -> bool; + + //! Get all currently registered type descriptors. + //! + //! @return A span containing all currently registered filesystem type descriptors. + [[nodiscard]] auto all() const noexcept -> std::span<pointer>; + + private: + //! A map from filesystem names (identifiers) to filesystem type descriptors. + kstd::flat_map<std::string_view, pointer> m_descriptors{}; + }; + +} // namespace kernel::filesystem + +#endif diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp index c8aae5c..ddc9a9b 100644 --- a/kernel/include/kernel/filesystem/vfs.hpp +++ b/kernel/include/kernel/filesystem/vfs.hpp @@ -6,11 +6,8 @@ #include <kernel/filesystem/filesystem.hpp> #include <kernel/filesystem/mount.hpp> #include <kernel/filesystem/mount_table.hpp> -#include <kernel/filesystem/type.hpp> -#include <kstd/flat_map> #include <kstd/memory> -#include <kstd/string> #include <string_view> #include <utility> @@ -109,8 +106,6 @@ namespace kernel::filesystem auto graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void; - //! A map from filesystem names (identifiers) to filesystem type descriptors. - kstd::flat_map<kstd::string, kstd::observer_ptr<type const>> m_filesystems{}; mount_table m_mount_table{}; }; } // namespace kernel::filesystem |
