mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 19:17:41 +00:00
Kernel: Keep TTY names in character buffers instead of Strings
Just going over some little unnecessary little kmalloc allocations.
This commit is contained in:
parent
2305dee455
commit
2f37fa487d
7 changed files with 27 additions and 31 deletions
|
@ -966,7 +966,8 @@ int Process::sys$ttyname_r(int fd, char* buffer, ssize_t size)
|
||||||
auto tty_name = description->tty()->tty_name();
|
auto tty_name = description->tty()->tty_name();
|
||||||
if (size < tty_name.length() + 1)
|
if (size < tty_name.length() + 1)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
strcpy(buffer, tty_name.characters());
|
memcpy(buffer, tty_name.characters_without_null_termination(), tty_name.length());
|
||||||
|
buffer[tty_name.length()] = '\0';
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ SlavePTY::SlavePTY(MasterPTY& master, unsigned index)
|
||||||
, m_master(master)
|
, m_master(master)
|
||||||
, m_index(index)
|
, m_index(index)
|
||||||
{
|
{
|
||||||
m_tty_name = String::format("/dev/pts/%u", m_index);
|
ksprintf(m_tty_name, "/dev/pts/%u", m_index);
|
||||||
set_uid(current->process().uid());
|
set_uid(current->process().uid());
|
||||||
set_gid(current->process().gid());
|
set_gid(current->process().gid());
|
||||||
DevPtsFS::register_slave_pty(*this);
|
DevPtsFS::register_slave_pty(*this);
|
||||||
|
@ -25,7 +25,7 @@ SlavePTY::~SlavePTY()
|
||||||
DevPtsFS::unregister_slave_pty(*this);
|
DevPtsFS::unregister_slave_pty(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
String SlavePTY::tty_name() const
|
StringView SlavePTY::tty_name() const
|
||||||
{
|
{
|
||||||
return m_tty_name;
|
return m_tty_name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// ^TTY
|
// ^TTY
|
||||||
virtual String tty_name() const override;
|
virtual StringView tty_name() const override;
|
||||||
virtual ssize_t on_tty_write(const u8*, ssize_t) override;
|
virtual ssize_t on_tty_write(const u8*, ssize_t) override;
|
||||||
|
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
|
@ -29,5 +29,5 @@ private:
|
||||||
|
|
||||||
RefPtr<MasterPTY> m_master;
|
RefPtr<MasterPTY> m_master;
|
||||||
unsigned m_index;
|
unsigned m_index;
|
||||||
String m_tty_name;
|
char m_tty_name[32];
|
||||||
};
|
};
|
||||||
|
|
|
@ -62,17 +62,17 @@ void TTY::emit(u8 ch)
|
||||||
{
|
{
|
||||||
if (should_generate_signals()) {
|
if (should_generate_signals()) {
|
||||||
if (ch == m_termios.c_cc[VINTR]) {
|
if (ch == m_termios.c_cc[VINTR]) {
|
||||||
dbgprintf("%s: VINTR pressed!\n", tty_name().characters());
|
dbg() << tty_name() << ": VINTR pressed!";
|
||||||
generate_signal(SIGINT);
|
generate_signal(SIGINT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ch == m_termios.c_cc[VQUIT]) {
|
if (ch == m_termios.c_cc[VQUIT]) {
|
||||||
dbgprintf("%s: VQUIT pressed!\n", tty_name().characters());
|
dbg() << tty_name() << ": VQUIT pressed!";
|
||||||
generate_signal(SIGQUIT);
|
generate_signal(SIGQUIT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (ch == m_termios.c_cc[VSUSP]) {
|
if (ch == m_termios.c_cc[VSUSP]) {
|
||||||
dbgprintf("%s: VSUSP pressed!\n", tty_name().characters());
|
dbg() << tty_name() << ": VSUSP pressed!";
|
||||||
generate_signal(SIGTSTP);
|
generate_signal(SIGTSTP);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -84,10 +84,10 @@ void TTY::generate_signal(int signal)
|
||||||
{
|
{
|
||||||
if (!pgid())
|
if (!pgid())
|
||||||
return;
|
return;
|
||||||
dbgprintf("%s: Send signal %d to everyone in pgrp %d\n", tty_name().characters(), signal, pgid());
|
dbg() << tty_name() << ": Send signal " << signal << " to everyone in pgrp " << pgid();
|
||||||
InterruptDisabler disabler; // FIXME: Iterate over a set of process handles instead?
|
InterruptDisabler disabler; // FIXME: Iterate over a set of process handles instead?
|
||||||
Process::for_each_in_pgrp(pgid(), [&](auto& process) {
|
Process::for_each_in_pgrp(pgid(), [&](auto& process) {
|
||||||
dbgprintf("%s: Send signal %d to %d\n", tty_name().characters(), signal, process.pid());
|
dbg() << tty_name() << ": Send signal " << signal << " to " << process;
|
||||||
process.send_signal(signal, nullptr);
|
process.send_signal(signal, nullptr);
|
||||||
return IterationDecision::Continue;
|
return IterationDecision::Continue;
|
||||||
});
|
});
|
||||||
|
@ -96,22 +96,17 @@ void TTY::generate_signal(int signal)
|
||||||
void TTY::set_termios(const termios& t)
|
void TTY::set_termios(const termios& t)
|
||||||
{
|
{
|
||||||
m_termios = t;
|
m_termios = t;
|
||||||
dbgprintf("%s set_termios: ECHO=%u, ISIG=%u, ICANON=%u\n",
|
dbg() << tty_name() << " set_termios: "
|
||||||
tty_name().characters(),
|
<< "ECHO=" << should_echo_input()
|
||||||
should_echo_input(),
|
<< ", ISIG=" << should_generate_signals()
|
||||||
should_generate_signals(),
|
<< ", ICANON=" << in_canonical_mode()
|
||||||
in_canonical_mode());
|
<< ", ECHOE=" << ((m_termios.c_lflag & ECHOE) != 0)
|
||||||
dbgprintf("%s set_termios: ECHOE=%u, ECHOK=%u, ECHONL=%u\n",
|
<< ", ECHOK=" << ((m_termios.c_lflag & ECHOK) != 0)
|
||||||
tty_name().characters(),
|
<< ", ECHONL=" << ((m_termios.c_lflag & ECHONL) != 0)
|
||||||
(m_termios.c_lflag & ECHOE) != 0,
|
<< ", ISTRIP=" << ((m_termios.c_iflag & ISTRIP) != 0)
|
||||||
(m_termios.c_lflag & ECHOK) != 0,
|
<< ", ICRNL=" << ((m_termios.c_iflag & ICRNL) != 0)
|
||||||
(m_termios.c_lflag & ECHONL) != 0);
|
<< ", INLCR=" << ((m_termios.c_iflag & INLCR) != 0)
|
||||||
dbgprintf("%s set_termios: ISTRIP=%u, ICRNL=%u, INLCR=%u, IGNCR=%u\n",
|
<< ", IGNCR=" << ((m_termios.c_iflag & IGNCR) != 0);
|
||||||
tty_name().characters(),
|
|
||||||
(m_termios.c_iflag & ISTRIP) != 0,
|
|
||||||
(m_termios.c_iflag & ICRNL) != 0,
|
|
||||||
(m_termios.c_iflag & INLCR) != 0,
|
|
||||||
(m_termios.c_iflag & IGNCR) != 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TTY::ioctl(FileDescription&, unsigned request, unsigned arg)
|
int TTY::ioctl(FileDescription&, unsigned request, unsigned arg)
|
||||||
|
|
|
@ -18,7 +18,7 @@ public:
|
||||||
virtual int ioctl(FileDescription&, unsigned request, unsigned arg) override final;
|
virtual int ioctl(FileDescription&, unsigned request, unsigned arg) override final;
|
||||||
virtual String absolute_path(const FileDescription&) const override { return tty_name(); }
|
virtual String absolute_path(const FileDescription&) const override { return tty_name(); }
|
||||||
|
|
||||||
virtual String tty_name() const = 0;
|
virtual StringView tty_name() const = 0;
|
||||||
|
|
||||||
unsigned short rows() const { return m_rows; }
|
unsigned short rows() const { return m_rows; }
|
||||||
unsigned short columns() const { return m_columns; }
|
unsigned short columns() const { return m_columns; }
|
||||||
|
|
|
@ -41,7 +41,7 @@ VirtualConsole::VirtualConsole(unsigned index, InitialContents initial_contents)
|
||||||
: TTY(4, index)
|
: TTY(4, index)
|
||||||
, m_index(index)
|
, m_index(index)
|
||||||
{
|
{
|
||||||
m_tty_name = String::format("/dev/tty%u", m_index);
|
ksprintf(m_tty_name, "/dev/tty%u", m_index);
|
||||||
set_size(80, 25);
|
set_size(80, 25);
|
||||||
m_horizontal_tabs = static_cast<u8*>(kmalloc(columns()));
|
m_horizontal_tabs = static_cast<u8*>(kmalloc(columns()));
|
||||||
for (unsigned i = 0; i < columns(); ++i)
|
for (unsigned i = 0; i < columns(); ++i)
|
||||||
|
@ -541,7 +541,7 @@ ssize_t VirtualConsole::on_tty_write(const u8* data, ssize_t size)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
String VirtualConsole::tty_name() const
|
StringView VirtualConsole::tty_name() const
|
||||||
{
|
{
|
||||||
return m_tty_name;
|
return m_tty_name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ private:
|
||||||
|
|
||||||
// ^TTY
|
// ^TTY
|
||||||
virtual ssize_t on_tty_write(const u8*, ssize_t) override;
|
virtual ssize_t on_tty_write(const u8*, ssize_t) override;
|
||||||
virtual String tty_name() const override;
|
virtual StringView tty_name() const override;
|
||||||
|
|
||||||
// ^CharacterDevice
|
// ^CharacterDevice
|
||||||
virtual const char* class_name() const override { return "VirtualConsole"; }
|
virtual const char* class_name() const override { return "VirtualConsole"; }
|
||||||
|
@ -87,5 +87,5 @@ private:
|
||||||
Vector<u8> m_parameters;
|
Vector<u8> m_parameters;
|
||||||
Vector<u8> m_intermediates;
|
Vector<u8> m_intermediates;
|
||||||
u8* m_horizontal_tabs { nullptr };
|
u8* m_horizontal_tabs { nullptr };
|
||||||
String m_tty_name;
|
char m_tty_name[32];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue