From 16967cd9c0d3549e20da823648e8efb36f7306f2 Mon Sep 17 00:00:00 2001 From: DcraftBg Date: Fri, 15 May 2026 21:21:32 +0300 Subject: [PATCH] Kernel: Replace is_* with kind field Replaced the is_* virtual functions with a kind field instead --- kernel/include/kernel/Device/Device.h | 1 - kernel/include/kernel/Epoll.h | 3 +-- kernel/include/kernel/FS/Inode.h | 19 ++++++++++++++----- kernel/include/kernel/FS/Pipe.h | 2 -- kernel/include/kernel/Terminal/TTY.h | 2 -- kernel/kernel/Device/Device.cpp | 5 +++-- kernel/kernel/FS/Pipe.cpp | 1 + kernel/kernel/Terminal/TTY.cpp | 1 + 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/kernel/include/kernel/Device/Device.h b/kernel/include/kernel/Device/Device.h index 9163be6c..ffd3b517 100644 --- a/kernel/include/kernel/Device/Device.h +++ b/kernel/include/kernel/Device/Device.h @@ -12,7 +12,6 @@ namespace Kernel virtual ~Device() = default; virtual void update() {} - virtual bool is_device() const override { return true; } virtual bool is_partition() const { return false; } virtual bool is_storage_device() const { return false; } diff --git a/kernel/include/kernel/Epoll.h b/kernel/include/kernel/Epoll.h index 35a4e1c1..40789e3c 100644 --- a/kernel/include/kernel/Epoll.h +++ b/kernel/include/kernel/Epoll.h @@ -35,11 +35,10 @@ namespace Kernel m_blocks = 0; m_dev = 0; m_rdev = 0; + m_kind = InodeKind::EPOLL; } public: - bool is_epoll() const override { return true; } - const FileSystem* filesystem() const override { return nullptr; } bool can_read_impl() const override { return false; } diff --git a/kernel/include/kernel/FS/Inode.h b/kernel/include/kernel/FS/Inode.h index 1d6c6008..a806bc3e 100644 --- a/kernel/include/kernel/FS/Inode.h +++ b/kernel/include/kernel/FS/Inode.h @@ -61,7 +61,12 @@ namespace Kernel bool ifsock() const { return (mode & Mask::TYPE_MASK) == Mask::IFSOCK; } mode_t mode; }; - + enum InodeKind : uint8_t { + DEVICE = 0x1, + EPOLL = 0x2, + PIPE = 0x4, + TTY = 0x8, + }; public: virtual ~Inode() {} @@ -83,10 +88,10 @@ namespace Kernel dev_t dev() const { return m_dev; } dev_t rdev() const { return m_rdev; } - virtual bool is_device() const { return false; } - virtual bool is_epoll() const { return false; } - virtual bool is_pipe() const { return false; } - virtual bool is_tty() const { return false; } + bool is_device() const { return m_kind & InodeKind::DEVICE; } + bool is_epoll() const { return m_kind & InodeKind::EPOLL; } + bool is_pipe() const { return m_kind & InodeKind::PIPE; } + bool is_tty() const { return m_kind & InodeKind::TTY; } virtual const FileSystem* filesystem() const = 0; @@ -183,6 +188,10 @@ namespace Kernel virtual BAN::ErrorOr ioctl_impl(int, void*) { return BAN::Error::from_errno(ENOTSUP); } protected: + // TODO: this is supposed to be const I guess? + // But the thing is I would have to refactor a big chunk of the codebase + // to add it as a parameter to Inode() soooooo yeah no, not doing that rn. + uint8_t m_kind = 0; BAN::Atomic m_ino; BAN::Atomic m_mode; BAN::Atomic m_nlink; diff --git a/kernel/include/kernel/FS/Pipe.h b/kernel/include/kernel/FS/Pipe.h index e5d0a167..2ee840c5 100644 --- a/kernel/include/kernel/FS/Pipe.h +++ b/kernel/include/kernel/FS/Pipe.h @@ -13,8 +13,6 @@ namespace Kernel public: static BAN::ErrorOr> create(const Credentials&); - virtual bool is_pipe() const override { return true; } - void on_close(int status_flags) override; void on_clone(int status_flags) override; diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index 71ab1048..42d23332 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -49,8 +49,6 @@ namespace Kernel void on_key_event(LibInput::KeyEvent); void handle_input_byte(uint8_t); - virtual bool is_tty() const override { return true; } - virtual void clear() = 0; virtual BAN::ErrorOr chmod_impl(mode_t) override; diff --git a/kernel/kernel/Device/Device.cpp b/kernel/kernel/Device/Device.cpp index 592f177d..7766ca67 100644 --- a/kernel/kernel/Device/Device.cpp +++ b/kernel/kernel/Device/Device.cpp @@ -11,6 +11,7 @@ namespace Kernel MUST(DevFileSystem::get().allocate_inode(create_inode_info(mode, uid, gid))), create_inode_info(mode, uid, gid) ) - { } - + { + m_kind |= InodeKind::DEVICE; + } } diff --git a/kernel/kernel/FS/Pipe.cpp b/kernel/kernel/FS/Pipe.cpp index 2d259e24..bcb18347 100644 --- a/kernel/kernel/FS/Pipe.cpp +++ b/kernel/kernel/FS/Pipe.cpp @@ -39,6 +39,7 @@ namespace Kernel m_blocks = 0; m_dev = 0; // FIXME m_rdev = 0; // FIXME + m_kind = InodeKind::PIPE; } void Pipe::on_clone(int status_flags) diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 085a2a09..a4d89068 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -74,6 +74,7 @@ namespace Kernel : CharacterDevice(mode, uid, gid) , m_termios(termios) { + m_kind |= InodeKind::TTY; m_rdev = next_tty_rdev(); m_output.buffer = MUST(ByteRingBuffer::create(PAGE_SIZE)); }