1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-15 19:37:35 +00:00
serenity/Kernel/TTY/TTY.h
Conrad Pankoff 4b44962e03 Kernel: Use a CircularQueue for input rather than a DoubleBuffer
TTY::emit is called from an IRQ handler, and is used to push input data
into a buffer for later retrieval. Previously this was using DoubleBuffer,
but that class wants to take a lock. Our lock code wants to make sure
interrupts are enabled, but they're disabled while an IRQ handler is
running. This made the kernel sad, but this CircularQueue cheers it up by
avoiding the lock requirement completely.
2019-08-12 14:15:24 +02:00

55 lines
1.7 KiB
C++

#pragma once
#include "DoubleBuffer.h"
#include <AK/CircularQueue.h>
#include <Kernel/Devices/CharacterDevice.h>
#include <Kernel/UnixTypes.h>
class Process;
class TTY : public CharacterDevice {
public:
virtual ~TTY() override;
virtual ssize_t read(FileDescription&, u8*, ssize_t) override;
virtual ssize_t write(FileDescription&, const u8*, ssize_t) override;
virtual bool can_read(FileDescription&) const override;
virtual bool can_write(FileDescription&) const override;
virtual int ioctl(FileDescription&, unsigned request, unsigned arg) override final;
virtual String absolute_path(const FileDescription&) const override { return tty_name(); }
virtual String tty_name() const = 0;
unsigned short rows() const { return m_rows; }
unsigned short columns() const { return m_columns; }
void set_pgid(pid_t pgid) { m_pgid = pgid; }
pid_t pgid() const { return m_pgid; }
void set_termios(const termios&);
bool should_generate_signals() const { return m_termios.c_lflag & ISIG; }
bool should_echo_input() const { return m_termios.c_lflag & ECHO; }
bool in_canonical_mode() const { return m_termios.c_lflag & ICANON; }
void set_default_termios();
void hang_up();
protected:
virtual ssize_t on_tty_write(const u8*, ssize_t) = 0;
void set_size(unsigned short columns, unsigned short rows);
TTY(unsigned major, unsigned minor);
void emit(u8);
void generate_signal(int signal);
private:
// ^CharacterDevice
virtual bool is_tty() const final override { return true; }
CircularQueue<u8, 16> m_input_buffer;
pid_t m_pgid { 0 };
termios m_termios;
unsigned short m_rows { 0 };
unsigned short m_columns { 0 };
};