Sfoglia il codice sorgente

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.
Andreas Kling 6 anni fa
parent
commit
2b4374d08e
4 ha cambiato i file con 7 aggiunte e 4 eliminazioni
  1. 1 0
      Kernel/MasterPTY.cpp
  2. 4 3
      Kernel/SlavePTY.cpp
  3. 1 1
      Kernel/SlavePTY.h
  4. 1 0
      Terminal/main.cpp

+ 1 - 0
Kernel/MasterPTY.cpp

@@ -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);
 }
 

+ 4 - 3
Kernel/SlavePTY.cpp

@@ -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>());
 }

+ 1 - 1
Kernel/SlavePTY.h

@@ -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;
 };

+ 1 - 0
Terminal/main.cpp

@@ -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)) {