From 81203c1aefda0db93ec9d17b8a292dc15615e246 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Wed, 20 Dec 2023 18:59:25 +0000 Subject: [PATCH 1/2] use waitpid to avoid zombie terminal processes --- .../TTkWidgets/TTkTerminal/terminalhelper.py | 21 +++++++++++++------ TermTk/TTkWidgets/TTkTerminal/terminalview.py | 3 --- tests/t.pty/test.pty.006.terminal.06.py | 7 ++----- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/TermTk/TTkWidgets/TTkTerminal/terminalhelper.py b/TermTk/TTkWidgets/TTkTerminal/terminalhelper.py index 2400485d..f33de18f 100644 --- a/TermTk/TTkWidgets/TTkTerminal/terminalhelper.py +++ b/TermTk/TTkWidgets/TTkTerminal/terminalhelper.py @@ -32,9 +32,10 @@ class TTkTerminalHelper(): __slots__ = ('_shell', '_fd', '_inout', '_pid', '_quit_pipe', '_size', '_term', #Signals - 'dataOut') + 'terminalClosed', 'dataOut') def __init__(self, term=None) -> None: self.dataOut = pyTTkSignal(str) + self.terminalClosed = pyTTkSignal() self._shell = os.environ.get('SHELL', 'sh') self._fd = None self._inout = None @@ -51,6 +52,7 @@ class TTkTerminalHelper(): self.dataOut.connect(term.termWrite) term.termData.connect(self.push) term.termResized.connect(self.resize) + term.closed.connect(self._quit) def runShell(self, program=None): self._shell = program if program else self._shell @@ -72,7 +74,9 @@ class TTkTerminalHelper(): self._quit_pipe = os.pipe() - threading.Thread(target=self.loop,args=[self]).start() + threading.Thread(target=self.loop).start() + threading.Thread(target=lambda pid=self._pid:os.waitpid(pid,0)).start() + if self._term: self.resize(*self._term.termSize()) self._term = None @@ -95,16 +99,20 @@ class TTkTerminalHelper(): @pyTTkSlot() def _quit(self): - if self._pid: - os.kill(self._pid,0) - os.kill(self._pid,15) + if pid := self._pid: + try: + os.kill(pid,0) + os.kill(pid,15) + # os.kill(pid,9) + except: + pass if self._quit_pipe: try: os.write(self._quit_pipe[1], b'quit') except: pass - def loop(self, _): + def loop(self): while rs := select( [self._inout,self._quit_pipe[0]], [], [])[0]: if self._quit_pipe[0] in rs: # os.close(self._quit_pipe[0]) @@ -130,6 +138,7 @@ class TTkTerminalHelper(): fcntl.fcntl(self._inout, fcntl.F_SETFL, _fl) except Exception as e: TTkLog.error(f"Error: {e=}") + self._quit() self.terminalClosed.emit() return diff --git a/TermTk/TTkWidgets/TTkTerminal/terminalview.py b/TermTk/TTkWidgets/TTkTerminal/terminalview.py index 4cb1a751..4221f3e3 100644 --- a/TermTk/TTkWidgets/TTkTerminal/terminalview.py +++ b/TermTk/TTkWidgets/TTkTerminal/terminalview.py @@ -143,9 +143,6 @@ class TTkTerminalView(TTkAbstractScrollView, _TTkTerminal_CSI_DEC): def viewDisplayedSize(self) -> (int, int): return self.size() - def close(self): - self._quit() - def termSize(self): return self.size() diff --git a/tests/t.pty/test.pty.006.terminal.06.py b/tests/t.pty/test.pty.006.terminal.06.py index 1eb54d8b..17f9028e 100755 --- a/tests/t.pty/test.pty.006.terminal.06.py +++ b/tests/t.pty/test.pty.006.terminal.06.py @@ -76,15 +76,12 @@ def _addTerminal(): win = ttk.TTkWindow(pos=(12,0), size=(100,30), title=f"Terminallo n.{tnum}", border=True, layout=ttk.TTkVBoxLayout(), flags = ttk.TTkK.WindowFlag.WindowMinMaxButtonsHint|ttk.TTkK.WindowFlag.WindowCloseButtonHint) term = ttk.TTkTerminal(parent=win) - th = ttk.TTkTerminalHelper() - th.dataOut.connect(term.termWrite) - term.termData.connect(th.push) - term.termResized.connect(th.resize) + th = ttk.TTkTerminalHelper(term=term) + th.terminalClosed.connect(win.close) term.bell.connect(lambda : ttk.TTkLog.debug("BELL!!! 🔔🔔🔔")) term.titleChanged.connect(win.setTitle) - term.terminalClosed.connect(win.close) term.textSelected.connect(clipboard.setText) term.textSelected.connect(_textSelected) win.closed.connect(term.close) From 13836111fc97aa8a1ec088d0cad6b017503f6199 Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Tue, 2 Jan 2024 14:50:08 +0000 Subject: [PATCH 2/2] FIX: Sandbox file loading --- tests/sandbox/js/ttkproxy.js | 2 +- tests/sandbox/sandbox.NerdFont.html | 2 +- tests/sandbox/sandbox.base.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/sandbox/js/ttkproxy.js b/tests/sandbox/js/ttkproxy.js index d805d0f6..b62be65e 100644 --- a/tests/sandbox/js/ttkproxy.js +++ b/tests/sandbox/js/ttkproxy.js @@ -73,7 +73,7 @@ class TTkProxy { } async loadFile(fileUri,file){ - this.pyodide.FS.writeFile(this.pyodide.FS.currentPath+file, await (await fetch(fileUri)).text()); + this.pyodide.FS.writeFile(this.pyodide.FS.currentPath+'/'+file, await (await fetch(fileUri)).text()); } readFile(file){ diff --git a/tests/sandbox/sandbox.NerdFont.html b/tests/sandbox/sandbox.NerdFont.html index dced2e1b..8c1a4e93 100644 --- a/tests/sandbox/sandbox.NerdFont.html +++ b/tests/sandbox/sandbox.NerdFont.html @@ -147,7 +147,7 @@ fileUri = urlParams.get("fileUri") filePath = urlParams.get("filePath") if (fileUri != null){ - ttkProxy.loadFile(fileUri, "test_file.py"); + await ttkProxy.loadFile(fileUri, "test_file.py"); loadFile("test_file.py") }else if (filePath != null){ loadFile(filePath) diff --git a/tests/sandbox/sandbox.base.html b/tests/sandbox/sandbox.base.html index 9557835c..deeba8b7 100644 --- a/tests/sandbox/sandbox.base.html +++ b/tests/sandbox/sandbox.base.html @@ -157,7 +157,7 @@ fileUri = urlParams.get("fileUri") filePath = urlParams.get("filePath") if (fileUri != null){ - ttkProxy.loadFile(fileUri, "test_file.py"); + await ttkProxy.loadFile(fileUri, "test_file.py"); loadFile("test_file.py") }else if (filePath != null){ loadFile(filePath)