OLD | NEW |
1 # Copyright (c) 2009, Google Inc. All rights reserved. | 1 # Copyright (c) 2009, Google Inc. All rights reserved. |
2 # Copyright (c) 2009 Apple Inc. All rights reserved. | 2 # Copyright (c) 2009 Apple Inc. All rights reserved. |
3 # | 3 # |
4 # Redistribution and use in source and binary forms, with or without | 4 # Redistribution and use in source and binary forms, with or without |
5 # modification, are permitted provided that the following conditions are | 5 # modification, are permitted provided that the following conditions are |
6 # met: | 6 # met: |
7 # | 7 # |
8 # * Redistributions of source code must retain the above copyright | 8 # * Redistributions of source code must retain the above copyright |
9 # notice, this list of conditions and the following disclaimer. | 9 # notice, this list of conditions and the following disclaimer. |
10 # * Redistributions in binary form must reproduce the above | 10 # * Redistributions in binary form must reproduce the above |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 # to work in cygwin, however it occasionally raises EAGAIN. | 141 # to work in cygwin, however it occasionally raises EAGAIN. |
142 retries_left = 10 if sys.platform == "cygwin" else 1 | 142 retries_left = 10 if sys.platform == "cygwin" else 1 |
143 while retries_left > 0: | 143 while retries_left > 0: |
144 try: | 144 try: |
145 retries_left -= 1 | 145 retries_left -= 1 |
146 os.kill(pid, signal.SIGKILL) | 146 os.kill(pid, signal.SIGKILL) |
147 _ = os.waitpid(pid, os.WNOHANG) | 147 _ = os.waitpid(pid, os.WNOHANG) |
148 except OSError as e: | 148 except OSError as e: |
149 if e.errno == errno.EAGAIN: | 149 if e.errno == errno.EAGAIN: |
150 if retries_left <= 0: | 150 if retries_left <= 0: |
151 _log.warn("Failed to kill pid %s. Too many EAGAIN error
s." % pid) | 151 _log.warning("Failed to kill pid %s. Too many EAGAIN er
rors.", pid) |
152 continue | 152 continue |
153 if e.errno == errno.ESRCH: # The process does not exist. | 153 if e.errno == errno.ESRCH: # The process does not exist. |
154 return | 154 return |
155 if e.errno == errno.EPIPE: # The process has exited already on
cygwin | 155 if e.errno == errno.EPIPE: # The process has exited already on
cygwin |
156 return | 156 return |
157 if e.errno == errno.ECHILD: | 157 if e.errno == errno.ECHILD: |
158 # Can't wait on a non-child process, but the kill worked. | 158 # Can't wait on a non-child process, but the kill worked. |
159 return | 159 return |
160 if e.errno == errno.EACCES and sys.platform == 'cygwin': | 160 if e.errno == errno.EACCES and sys.platform == 'cygwin': |
161 # Cygwin python sometimes can't kill native processes. | 161 # Cygwin python sometimes can't kill native processes. |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 | 370 |
371 # run_command automatically decodes to unicode() unless explicitly told
not to. | 371 # run_command automatically decodes to unicode() unless explicitly told
not to. |
372 if decode_output: | 372 if decode_output: |
373 output = output.decode(self._child_process_encoding(), errors="repla
ce") | 373 output = output.decode(self._child_process_encoding(), errors="repla
ce") |
374 | 374 |
375 # wait() is not threadsafe and can throw OSError due to: | 375 # wait() is not threadsafe and can throw OSError due to: |
376 # http://bugs.python.org/issue1731717 | 376 # http://bugs.python.org/issue1731717 |
377 exit_code = process.wait() | 377 exit_code = process.wait() |
378 | 378 |
379 if debug_logging: | 379 if debug_logging: |
380 _log.debug('"%s" took %.2fs' % (self.command_for_printing(args), tim
e.time() - start_time)) | 380 _log.debug('"%s" took %.2fs', self.command_for_printing(args), time.
time() - start_time) |
381 | 381 |
382 if return_exit_code: | 382 if return_exit_code: |
383 return exit_code | 383 return exit_code |
384 | 384 |
385 if exit_code: | 385 if exit_code: |
386 script_error = ScriptError(script_args=args, | 386 script_error = ScriptError(script_args=args, |
387 exit_code=exit_code, | 387 exit_code=exit_code, |
388 output=output, | 388 output=output, |
389 cwd=cwd) | 389 cwd=cwd) |
390 (error_handler or self.default_error_handler)(script_error) | 390 (error_handler or self.default_error_handler)(script_error) |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 pool.close() | 457 pool.close() |
458 pool.join() | 458 pool.join() |
459 | 459 |
460 | 460 |
461 def _run_command_thunk(cmd_line_and_cwd): | 461 def _run_command_thunk(cmd_line_and_cwd): |
462 # Note that this needs to be a bare module (and hence Picklable) method to w
ork with multiprocessing.Pool. | 462 # Note that this needs to be a bare module (and hence Picklable) method to w
ork with multiprocessing.Pool. |
463 (cmd_line, cwd) = cmd_line_and_cwd | 463 (cmd_line, cwd) = cmd_line_and_cwd |
464 proc = subprocess.Popen(cmd_line, cwd=cwd, stdout=subprocess.PIPE, stderr=su
bprocess.PIPE) | 464 proc = subprocess.Popen(cmd_line, cwd=cwd, stdout=subprocess.PIPE, stderr=su
bprocess.PIPE) |
465 stdout, stderr = proc.communicate() | 465 stdout, stderr = proc.communicate() |
466 return (proc.returncode, stdout, stderr) | 466 return (proc.returncode, stdout, stderr) |
OLD | NEW |