Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: pylib/gyp/input.py

Issue 23475007: Process all input files in parallel (Closed) Base URL: https://chromium.googlesource.com/external/gyp.git@master
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2012 Google Inc. All rights reserved. 1 # Copyright (c) 2012 Google Inc. 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 from compiler.ast import Const 5 from compiler.ast import Const
6 from compiler.ast import Dict 6 from compiler.ast import Dict
7 from compiler.ast import Discard 7 from compiler.ast import Discard
8 from compiler.ast import List 8 from compiler.ast import List
9 from compiler.ast import Module 9 from compiler.ast import Module
10 from compiler.ast import Node 10 from compiler.ast import Node
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 self.aux_data[key] = aux_data0[key] 545 self.aux_data[key] = aux_data0[key]
546 for new_dependency in dependencies0: 546 for new_dependency in dependencies0:
547 if new_dependency not in self.scheduled: 547 if new_dependency not in self.scheduled:
548 self.scheduled.add(new_dependency) 548 self.scheduled.add(new_dependency)
549 self.dependencies.append(new_dependency) 549 self.dependencies.append(new_dependency)
550 self.pending -= 1 550 self.pending -= 1
551 self.condition.notify() 551 self.condition.notify()
552 self.condition.release() 552 self.condition.release()
553 553
554 554
555 def LoadTargetBuildFileParallel(build_file_path, data, aux_data, 555 def LoadTargetBuildFilesParallel(build_files, data, aux_data,
556 variables, includes, depth, check): 556 variables, includes, depth, check):
557 parallel_state = ParallelState() 557 parallel_state = ParallelState()
558 parallel_state.condition = threading.Condition() 558 parallel_state.condition = threading.Condition()
559 parallel_state.dependencies = [build_file_path] 559 # Make copies of the build_files argument that we can modify while working.
560 parallel_state.scheduled = set([build_file_path]) 560 parallel_state.dependencies = list(build_files)
561 parallel_state.scheduled = set(build_files)
561 parallel_state.pending = 0 562 parallel_state.pending = 0
562 parallel_state.data = data 563 parallel_state.data = data
563 parallel_state.aux_data = aux_data 564 parallel_state.aux_data = aux_data
564 565
565 try: 566 try:
566 parallel_state.condition.acquire() 567 parallel_state.condition.acquire()
567 while parallel_state.dependencies or parallel_state.pending: 568 while parallel_state.dependencies or parallel_state.pending:
568 if parallel_state.error: 569 if parallel_state.error:
569 print >>sys.stderr, ( 570 print >>sys.stderr, (
570 '\n' 571 '\n'
(...skipping 2048 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 2620
2620 # Load build files. This loads every target-containing build file into 2621 # Load build files. This loads every target-containing build file into
2621 # the |data| dictionary such that the keys to |data| are build file names, 2622 # the |data| dictionary such that the keys to |data| are build file names,
2622 # and the values are the entire build file contents after "early" or "pre" 2623 # and the values are the entire build file contents after "early" or "pre"
2623 # processing has been done and includes have been resolved. 2624 # processing has been done and includes have been resolved.
2624 # NOTE: data contains both "target" files (.gyp) and "includes" (.gypi), as 2625 # NOTE: data contains both "target" files (.gyp) and "includes" (.gypi), as
2625 # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps 2626 # well as meta-data (e.g. 'included_files' key). 'target_build_files' keeps
2626 # track of the keys corresponding to "target" files. 2627 # track of the keys corresponding to "target" files.
2627 data = {'target_build_files': set()} 2628 data = {'target_build_files': set()}
2628 aux_data = {} 2629 aux_data = {}
2629 for build_file in build_files: 2630 # Normalize paths everywhere. This is important because paths will be
2630 # Normalize paths everywhere. This is important because paths will be 2631 # used as keys to the data dict and for references between input files.
2631 # used as keys to the data dict and for references between input files. 2632 build_files = set(map(os.path.normpath, build_files))
2632 build_file = os.path.normpath(build_file) 2633 if parallel:
2633 try: 2634 LoadTargetBuildFilesParallel(build_files, data, aux_data,
2634 if parallel: 2635 variables, includes, depth, check)
2635 LoadTargetBuildFileParallel(build_file, data, aux_data, 2636 else:
2636 variables, includes, depth, check) 2637 for build_file in build_files:
2637 else: 2638 try:
2638 LoadTargetBuildFile(build_file, data, aux_data, 2639 LoadTargetBuildFile(build_file, data, aux_data,
2639 variables, includes, depth, check, True) 2640 variables, includes, depth, check, True)
2640 except Exception, e: 2641 except Exception, e:
2641 gyp.common.ExceptionAppend(e, 'while trying to load %s' % build_file) 2642 gyp.common.ExceptionAppend(e, 'while trying to load %s' % build_file)
2642 raise 2643 raise
2643 2644
2644 # Build a dict to access each target's subdict by qualified name. 2645 # Build a dict to access each target's subdict by qualified name.
2645 targets = BuildTargetsDict(data) 2646 targets = BuildTargetsDict(data)
2646 2647
2647 # Fully qualify all dependency links. 2648 # Fully qualify all dependency links.
2648 QualifyDependencies(targets) 2649 QualifyDependencies(targets)
2649 2650
2650 # Remove self-dependencies from targets that have 'prune_self_dependencies' 2651 # Remove self-dependencies from targets that have 'prune_self_dependencies'
2651 # set to 1. 2652 # set to 1.
2652 RemoveSelfDependencies(targets) 2653 RemoveSelfDependencies(targets)
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2741 ValidateRunAsInTarget(target, target_dict, build_file) 2742 ValidateRunAsInTarget(target, target_dict, build_file)
2742 ValidateActionsInTarget(target, target_dict, build_file) 2743 ValidateActionsInTarget(target, target_dict, build_file)
2743 2744
2744 # Generators might not expect ints. Turn them into strs. 2745 # Generators might not expect ints. Turn them into strs.
2745 TurnIntIntoStrInDict(data) 2746 TurnIntIntoStrInDict(data)
2746 2747
2747 # TODO(mark): Return |data| for now because the generator needs a list of 2748 # TODO(mark): Return |data| for now because the generator needs a list of
2748 # build files that came in. In the future, maybe it should just accept 2749 # build files that came in. In the future, maybe it should just accept
2749 # a list, and not the whole data dict. 2750 # a list, and not the whole data dict.
2750 return [flat_list, targets, data] 2751 return [flat_list, targets, data]
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698