mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-22 12:35:14 +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
Notes:
sideshowbarker
2024-07-19 15:55:12 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/2b4374d08e9
4 changed files with 7 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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>());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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)) {
|
||||
|
|
Loading…
Add table
Reference in a new issue