PTY: Write to child in separate thread
This commit is contained in:
parent
0610daaec7
commit
fa397a1d24
@ -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]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user