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:
parent
45fba60ab5
commit
2b4374d08e
4 changed files with 7 additions and 4 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue