1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:47:36 +00:00

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
4 changed files with 7 additions and 4 deletions

View file

@ -12,6 +12,7 @@ MasterPTY::MasterPTY(unsigned index)
MasterPTY::~MasterPTY() MasterPTY::~MasterPTY()
{ {
dbgprintf("~MasterPTY(%u)\n", m_index);
PTYMultiplexer::the().notify_master_destroyed(Badge<MasterPTY>(), 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() SlavePTY::~SlavePTY()
{ {
dbgprintf("~SlavePTY(%u)\n", m_index);
DevPtsFS::the().unregister_slave_pty(*this); DevPtsFS::the().unregister_slave_pty(*this);
VFS::the().unregister_character_device(*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) 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 bool SlavePTY::can_write(Process&) const
{ {
return m_master.can_write_from_slave(); return m_master->can_write_from_slave();
} }
void SlavePTY::close() 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; friend class MasterPTY;
SlavePTY(MasterPTY&, unsigned index); SlavePTY(MasterPTY&, unsigned index);
MasterPTY& m_master; RetainPtr<MasterPTY> m_master;
unsigned m_index; unsigned m_index;
InodeIdentifier m_devpts_inode_id; 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); int nfds = select(max(ptm_fd, event_fd) + 1, &rfds, nullptr, nullptr, nullptr);
if (nfds < 0) { if (nfds < 0) {
dbgprintf("Terminal(%u) select() failed :( errno=%d\n", getpid(), errno); dbgprintf("Terminal(%u) select() failed :( errno=%d\n", getpid(), errno);
return 1;
} }
if (FD_ISSET(ptm_fd, &rfds)) { if (FD_ISSET(ptm_fd, &rfds)) {