PTY: Write to child in separate thread

This commit is contained in:
Kovid Goyal 2022-02-24 00:26:08 +05:30
parent 0610daaec7
commit fa397a1d24
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -4,11 +4,13 @@
import fcntl import fcntl
import io import io
import os import os
import queue
import select import select
import shlex import shlex
import struct import struct
import sys import sys
import termios import termios
import threading
import time import time
from pty import CHILD, fork from pty import CHILD, fork
from unittest import TestCase from unittest import TestCase
@ -179,14 +181,30 @@ class PTY:
self.callbacks = Callbacks() self.callbacks = Callbacks()
self.screen = Screen(self.callbacks, rows, columns, scrollback, cell_width, cell_height, 0, self.callbacks) self.screen = Screen(self.callbacks, rows, columns, scrollback, cell_width, cell_height, 0, self.callbacks)
self.received_bytes = b'' self.received_bytes = b''
self.queue = queue.Queue()
self.thread = threading.Thread(name='PTYWriter', target=self.write_loop, daemon=True)
self.thread.start()
def __del__(self): def __del__(self):
if not self.is_child: if not self.is_child:
self.queue.put(None)
os.close(self.master_fd) os.close(self.master_fd)
del self.master_fd del self.master_fd
def write_loop(self):
while True:
x = self.queue.get()
if x is None:
break
try:
write_all(self.master_fd, x)
except AttributeError:
break
except OSError as err:
print(f'Failed to write to master_fd: {err}', file=sys.stderr)
def write_to_child(self, data): def write_to_child(self, data):
write_all(self.master_fd, data) self.queue.put(data)
def wait_for_input_from_child(self, timeout=10): def wait_for_input_from_child(self, timeout=10):
rd = select.select([self.master_fd], [], [], timeout)[0] rd = select.select([self.master_fd], [], [], timeout)[0]