Skip to content

Commit 9c9363d

Browse files
Fixed bug in remove_reader. 'ValueError: list.remove(x): x not in list'.
1 parent 3394bc1 commit 9c9363d

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

pymux/process.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ def __init__(self, eventloop, invalidate, exec_func, bell_func=None,
6767
self.pid = None
6868
self.is_terminated = False
6969
self.suspended = False
70+
self._reader_connected = False
7071

7172
# Create pseudo terminal for this pane.
7273
self.master, self.slave = os.openpty()
@@ -153,7 +154,7 @@ def done():
153154
" PID received. Back in the main thread. "
154155
# Close pty and remove reader.
155156
os.close(self.master)
156-
self.eventloop.remove_reader(self.master)
157+
self._remove_reader()
157158
self.master = None
158159

159160
# Callback.
@@ -256,12 +257,21 @@ def write_key(self, key):
256257
key, application_mode=self.screen.in_application_mode)
257258
self.write_input(data)
258259

260+
def _remove_reader(self):
261+
"""
262+
Stop processing stdout from the process.
263+
"""
264+
if self.master is not None and self._reader_connected:
265+
self.eventloop.remove_reader(self.master)
266+
self._reader_connected = False
267+
259268
def _connect_reader(self):
260269
"""
261270
Process stdout output from the process.
262271
"""
263-
if self.master is not None:
272+
if self.master is not None and not self._reader_connected:
264273
self.eventloop.add_reader(self.master, self._read)
274+
self._reader_connected = True
265275

266276
def _read(self):
267277
"""
@@ -282,13 +292,13 @@ def process():
282292

283293
# Otherwise, postpone processing until we have CPU time available.
284294
else:
285-
if self.master is not None:
286-
self.eventloop.remove_reader(self.master)
295+
self._remove_reader()
287296

288297
def do_asap():
289298
" Process output and reconnect to event loop. "
290299
process()
291-
self._connect_reader()
300+
if not self.suspended:
301+
self._connect_reader()
292302

293303
# When the event loop is saturated because of CPU, we will
294304
# postpone this processing max 'x' seconds.
@@ -303,14 +313,14 @@ def do_asap():
303313
do_asap, _max_postpone_until=timestamp)
304314
else:
305315
# End of stream. Remove child.
306-
self.eventloop.remove_reader(self.master)
316+
self._remove_reader()
307317

308318
def suspend(self):
309319
"""
310320
Suspend process. Stop reading stdout. (Called when going into copy mode.)
311321
"""
312322
self.suspended = True
313-
self.eventloop.remove_reader(self.master)
323+
self._remove_reader()
314324

315325
def resume(self):
316326
"""

0 commit comments

Comments
 (0)