mirror of
https://github.com/RGBCube/serenity
synced 2025-06-14 03:32:09 +00:00

The scheduler now operates on threads, rather than on processes. Each process has a main thread, and can have any number of additional threads. The process exits when the main thread exits. This patch doesn't actually spawn any additional threads, it merely does all the plumbing needed to make it possible. :^)
61 lines
1.3 KiB
C++
61 lines
1.3 KiB
C++
#include "SlavePTY.h"
|
|
#include "MasterPTY.h"
|
|
#include "DevPtsFS.h"
|
|
#include <Kernel/Process.h>
|
|
|
|
SlavePTY::SlavePTY(MasterPTY& master, unsigned index)
|
|
: TTY(11, index)
|
|
, m_master(master)
|
|
, m_index(index)
|
|
{
|
|
set_uid(current->process().uid());
|
|
set_gid(current->process().gid());
|
|
DevPtsFS::the().register_slave_pty(*this);
|
|
set_size(80, 25);
|
|
}
|
|
|
|
SlavePTY::~SlavePTY()
|
|
{
|
|
dbgprintf("~SlavePTY(%u)\n", m_index);
|
|
DevPtsFS::the().unregister_slave_pty(*this);
|
|
}
|
|
|
|
String SlavePTY::tty_name() const
|
|
{
|
|
return String::format("/dev/pts/%u", m_index);
|
|
}
|
|
|
|
void SlavePTY::on_master_write(const byte* buffer, ssize_t size)
|
|
{
|
|
for (ssize_t i = 0; i < size; ++i)
|
|
emit(buffer[i]);
|
|
}
|
|
|
|
ssize_t SlavePTY::on_tty_write(const byte* data, ssize_t size)
|
|
{
|
|
return m_master->on_slave_write(data, size);
|
|
}
|
|
|
|
bool SlavePTY::can_write(Process&) const
|
|
{
|
|
return m_master->can_write_from_slave();
|
|
}
|
|
|
|
bool SlavePTY::can_read(Process& process) const
|
|
{
|
|
if (m_master->is_closed())
|
|
return true;
|
|
return TTY::can_read(process);
|
|
}
|
|
|
|
ssize_t SlavePTY::read(Process& process, byte* buffer, ssize_t size)
|
|
{
|
|
if (m_master->is_closed())
|
|
return 0;
|
|
return TTY::read(process, buffer, size);
|
|
}
|
|
|
|
void SlavePTY::close()
|
|
{
|
|
m_master->notify_slave_closed(Badge<SlavePTY>());
|
|
}
|