| OLD | NEW |
| 1 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Generic utils.""" | 5 """Generic utils.""" |
| 6 | 6 |
| 7 import errno | 7 import errno |
| 8 import logging | 8 import logging |
| 9 import os | 9 import os |
| 10 import Queue | 10 import Queue |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 filter_fn: A function taking a single string argument called with each line | 325 filter_fn: A function taking a single string argument called with each line |
| 326 of the subprocess2's output. Each line has the trailing newline | 326 of the subprocess2's output. Each line has the trailing newline |
| 327 character trimmed. | 327 character trimmed. |
| 328 stdout: Can be any bufferable output. | 328 stdout: Can be any bufferable output. |
| 329 | 329 |
| 330 stderr is always redirected to stdout. | 330 stderr is always redirected to stdout. |
| 331 """ | 331 """ |
| 332 assert print_stdout or filter_fn | 332 assert print_stdout or filter_fn |
| 333 stdout = stdout or sys.stdout | 333 stdout = stdout or sys.stdout |
| 334 filter_fn = filter_fn or (lambda x: None) | 334 filter_fn = filter_fn or (lambda x: None) |
| 335 assert not 'stderr' in kwargs | |
| 336 kid = subprocess2.Popen( | 335 kid = subprocess2.Popen( |
| 337 args, bufsize=0, stdout=subprocess2.PIPE, stderr=subprocess2.STDOUT, | 336 args, bufsize=0, stdout=subprocess2.PIPE, stderr=subprocess2.STDOUT, |
| 338 **kwargs) | 337 **kwargs) |
| 339 | 338 |
| 340 # Do a flush of stdout before we begin reading from the subprocess2's stdout | 339 # Do a flush of stdout before we begin reading from the subprocess2's stdout |
| 341 stdout.flush() | 340 stdout.flush() |
| 342 | 341 |
| 343 # Also, we need to forward stdout to prevent weird re-ordering of output. | 342 # Also, we need to forward stdout to prevent weird re-ordering of output. |
| 344 # This has to be done on a per byte basis to make sure it is not buffered: | 343 # This has to be done on a per byte basis to make sure it is not buffered: |
| 345 # normally buffering is done for each line, but if svn requests input, no | 344 # normally buffering is done for each line, but if svn requests input, no |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 running = self.running | 580 running = self.running |
| 582 self.running = [] | 581 self.running = [] |
| 583 for t in running: | 582 for t in running: |
| 584 if t.isAlive(): | 583 if t.isAlive(): |
| 585 self.running.append(t) | 584 self.running.append(t) |
| 586 else: | 585 else: |
| 587 t.join() | 586 t.join() |
| 588 sys.stdout.full_flush() # pylint: disable=E1101 | 587 sys.stdout.full_flush() # pylint: disable=E1101 |
| 589 if self.progress: | 588 if self.progress: |
| 590 self.progress.update(1, t.item.name) | 589 self.progress.update(1, t.item.name) |
| 591 assert not t.item.name in self.ran | 590 if t.item.name in self.ran: |
| 591 raise Error( |
| 592 'gclient is confused, "%s" is already in "%s"' % ( |
| 593 t.item.name, ', '.join(self.ran))) |
| 592 if not t.item.name in self.ran: | 594 if not t.item.name in self.ran: |
| 593 self.ran.append(t.item.name) | 595 self.ran.append(t.item.name) |
| 594 | 596 |
| 595 def _run_one_task(self, task_item, args, kwargs): | 597 def _run_one_task(self, task_item, args, kwargs): |
| 596 if self.jobs > 1: | 598 if self.jobs > 1: |
| 597 # Start the thread. | 599 # Start the thread. |
| 598 index = len(self.ran) + len(self.running) + 1 | 600 index = len(self.ran) + len(self.running) + 1 |
| 599 new_thread = self._Worker(task_item, index, args, kwargs) | 601 new_thread = self._Worker(task_item, index, args, kwargs) |
| 600 self.running.append(new_thread) | 602 self.running.append(new_thread) |
| 601 new_thread.start() | 603 new_thread.start() |
| (...skipping 26 matching lines...) Expand all Loading... |
| 628 logging.info('Caught exception in thread %s' % self.item.name) | 630 logging.info('Caught exception in thread %s' % self.item.name) |
| 629 logging.info(str(sys.exc_info())) | 631 logging.info(str(sys.exc_info())) |
| 630 work_queue.exceptions.put(sys.exc_info()) | 632 work_queue.exceptions.put(sys.exc_info()) |
| 631 logging.info('Task %s done' % self.item.name) | 633 logging.info('Task %s done' % self.item.name) |
| 632 | 634 |
| 633 work_queue.ready_cond.acquire() | 635 work_queue.ready_cond.acquire() |
| 634 try: | 636 try: |
| 635 work_queue.ready_cond.notifyAll() | 637 work_queue.ready_cond.notifyAll() |
| 636 finally: | 638 finally: |
| 637 work_queue.ready_cond.release() | 639 work_queue.ready_cond.release() |
| OLD | NEW |