Skip to content

Commit c31300c

Browse files
authored
Force to close FIFO buffers instead of waiting for garbage collector (#93)
Bump to 2.1.3 Signed-off-by: Alexey Stepanov <penguinolog@gmail.com>
1 parent 027b029 commit c31300c

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

exec_helpers/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
"ExecResult",
5050
)
5151

52-
__version__ = "2.1.2"
52+
__version__ = "2.1.3"
5353
__author__ = "Alexey Stepanov"
5454
__author_email__ = "penguinolog@gmail.com"
5555
__maintainers__ = {

exec_helpers/subprocess_runner.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,13 @@ def poll_stderr() -> None:
189189
"""Sync stderr poll."""
190190
result.read_stderr(src=stderr, log=logger, verbose=verbose)
191191

192+
def close_streams() -> None:
193+
"""Enforce FIFO closure."""
194+
if stdout is not None and not stdout.closed:
195+
stdout.close()
196+
if stderr is not None and not stderr.closed:
197+
stderr.close()
198+
192199
# Store command with hidden data
193200
cmd_for_log = self._mask_command(cmd=command, log_mask_re=log_mask_re)
194201

@@ -211,6 +218,7 @@ def poll_stderr() -> None:
211218
# Process closed?
212219
if exit_code is not None:
213220
result.exit_code = exit_code
221+
close_streams()
214222
return result
215223
# Kill not ended process and wait for close
216224
try:
@@ -227,6 +235,8 @@ def poll_stderr() -> None:
227235
result.exit_code = exit_code
228236
return result
229237
raise # Some other error
238+
finally:
239+
close_streams()
230240

231241
wait_err_msg = _log_templates.CMD_WAIT_ERROR.format(result=result, timeout=timeout)
232242
logger.debug(wait_err_msg)

test/test_subprocess_runner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
class FakeFileStream(object):
4040
def __init__(self, *args):
4141
self.__src = list(args)
42+
self.closed = False
4243

4344
def __iter__(self):
4445
for _ in range(len(self.__src)):
@@ -47,6 +48,9 @@ def __iter__(self):
4748
def fileno(self):
4849
return hash(tuple(self.__src))
4950

51+
def close(self):
52+
self.closed = True
53+
5054

5155
# Subprocess extra arguments.
5256
# Flags from:

0 commit comments

Comments
 (0)