1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-06 04:07:35 +00:00
serenity/Kernel/TTY/SlavePTY.h
Andreas Kling 0de8c95d49 Kernel: Convert SlavePTY all-instances HashTable to an IntrusiveList
This simplifies the DevPtsFS implementation somewhat, as it no longer
requires SlavePTY to register itself with it, since it can now simply
use the list of SlavePTY instances.
2021-08-17 01:21:47 +02:00

59 lines
1.6 KiB
C++

/*
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <Kernel/FileSystem/InodeIdentifier.h>
#include <Kernel/TTY/TTY.h>
namespace Kernel {
class MasterPTY;
class SlavePTY final : public TTY {
public:
virtual bool unref() const override;
virtual ~SlavePTY() override;
void on_master_write(const UserOrKernelBuffer&, size_t);
unsigned index() const { return m_index; }
time_t time_of_last_write() const { return m_time_of_last_write; }
virtual FileBlockCondition& block_condition() override;
private:
// ^TTY
virtual String const& tty_name() const override;
virtual KResultOr<size_t> on_tty_write(const UserOrKernelBuffer&, size_t) override;
virtual void echo(u8) override;
// ^CharacterDevice
virtual bool can_read(const FileDescription&, size_t) const override;
virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual bool can_write(const FileDescription&, size_t) const override;
virtual StringView class_name() const override { return "SlavePTY"; }
virtual KResult close() override;
// ^Device
virtual String device_name() const override;
friend class MasterPTY;
SlavePTY(MasterPTY&, unsigned index);
RefPtr<MasterPTY> m_master;
time_t m_time_of_last_write { 0 };
unsigned m_index { 0 };
String m_tty_name;
mutable IntrusiveListNode<SlavePTY> m_list_node;
public:
using List = IntrusiveList<SlavePTY, RawPtr<SlavePTY>, &SlavePTY::m_list_node>;
static SpinLockProtectedValue<SlavePTY::List>& all_instances();
};
}