Let the slave PTY keep the master PTY alive.

This ownership model is a bit confusing. There's a retain cycle between
MasterPTY and SlavePTY, but it's broken when the SlavePTY is closed, meaning
that there are no more FileDescriptors referring to it.
This commit is contained in:
Andreas Kling 2019-01-30 19:05:59 +01:00
parent 45fba60ab5
commit 2b4374d08e
Notes: sideshowbarker 2024-07-19 15:55:12 +09:00
4 changed files with 7 additions and 4 deletions

View file

@ -12,6 +12,7 @@ MasterPTY::MasterPTY(unsigned index)
MasterPTY::~MasterPTY()
{
dbgprintf("~MasterPTY(%u)\n", m_index);
PTYMultiplexer::the().notify_master_destroyed(Badge<MasterPTY>(), m_index);
}

View file

@ -14,6 +14,7 @@ SlavePTY::SlavePTY(MasterPTY& master, unsigned index)
SlavePTY::~SlavePTY()
{
dbgprintf("~SlavePTY(%u)\n", m_index);
DevPtsFS::the().unregister_slave_pty(*this);
VFS::the().unregister_character_device(*this);
}
@ -31,15 +32,15 @@ void SlavePTY::on_master_write(const byte* buffer, size_t size)
void SlavePTY::on_tty_write(const byte* data, size_t size)
{
m_master.on_slave_write(data, size);
m_master->on_slave_write(data, size);
}
bool SlavePTY::can_write(Process&) const
{
return m_master.can_write_from_slave();
return m_master->can_write_from_slave();
}
void SlavePTY::close()
{
m_master.notify_slave_closed(Badge<SlavePTY>());
m_master->notify_slave_closed(Badge<SlavePTY>());
}

View file

@ -27,7 +27,7 @@ private:
friend class MasterPTY;
SlavePTY(MasterPTY&, unsigned index);
MasterPTY& m_master;
RetainPtr<MasterPTY> m_master;
unsigned m_index;
InodeIdentifier m_devpts_inode_id;
};

View file

@ -87,6 +87,7 @@ int main(int, char**)
int nfds = select(max(ptm_fd, event_fd) + 1, &rfds, nullptr, nullptr, nullptr);
if (nfds < 0) {
dbgprintf("Terminal(%u) select() failed :( errno=%d\n", getpid(), errno);
return 1;
}
if (FD_ISSET(ptm_fd, &rfds)) {