diff options
Diffstat (limited to 'src/python/pyabc.i')
-rw-r--r-- | src/python/pyabc.i | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/python/pyabc.i b/src/python/pyabc.i index 0e1f2c3d..74c21cc6 100644 --- a/src/python/pyabc.i +++ b/src/python/pyabc.i @@ -755,6 +755,16 @@ def _retry_read(fd): continue raise +def _retry_os_read(fd): + + while True: + try: + return os.read(fd, 1) + except OSError as e: + if e.errno == errno.EINTR: + continue + raise + def _retry_wait(): while True: @@ -817,6 +827,7 @@ def _child_wait_thread_func(fd): _active_pids.remove(pid) _terminated_pids[pid] = status + os.write(_wait_fd_write, "1") _terminated_pids_cond.notifyAll() _sigint_pipe_read_fd = -1 @@ -825,8 +836,14 @@ _sigint_pipe_write_fd = -1 _sigchld_pipe_read_fd = -1 _sigchld_pipe_write_fd = -1 +wait_fd = -1 +_wait_fd_write = -1 + def _start_threads(): + global wait_fd, _wait_fd_write + wait_fd, _wait_fd_write = os.pipe() + global _sigint_pipe_read_fd, _sigint_pipe_write_fd _sigint_pipe_read_fd, _sigint_pipe_write_fd = os.pipe() @@ -865,6 +882,9 @@ def after_fork(): _close_on_fork = [] + os.close(wait_fd) + os.close(_wait_fd_write) + os.close(_sigint_pipe_read_fd) os.close(_sigint_pipe_write_fd) @@ -934,6 +954,7 @@ def _waitpid(pid, options=0): with _active_lock: if pid in _terminated_pids: + _retry_os_read(wait_fd) status = _terminated_pids[pid] del _terminated_pids[pid] return pid, status @@ -950,6 +971,7 @@ def _wait(options=0): with _active_lock: for pid, status in _terminated_pids.iteritems(): + _retry_os_read(wait_fd) del _terminated_pids[pid] return pid, status |