OLD | NEW |
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 |
11 from compiler.ast import Stmt | 11 from compiler.ast import Stmt |
12 import compiler | 12 import compiler |
13 import copy | 13 import copy |
14 import gyp.common | 14 import gyp.common |
15 import multiprocessing | 15 import multiprocessing |
16 import optparse | 16 import optparse |
17 import os.path | 17 import os.path |
18 import re | 18 import re |
19 import shlex | 19 import shlex |
| 20 import signal |
20 import subprocess | 21 import subprocess |
21 import sys | 22 import sys |
22 import threading | 23 import threading |
23 import time | 24 import time |
24 from gyp.common import GypError | 25 from gyp.common import GypError |
25 | 26 |
26 | 27 |
27 # A list of types that are treated as linkable. | 28 # A list of types that are treated as linkable. |
28 linkable_types = ['executable', 'shared_library', 'loadable_module'] | 29 linkable_types = ['executable', 'shared_library', 'loadable_module'] |
29 | 30 |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 def CallLoadTargetBuildFile(global_flags, | 450 def CallLoadTargetBuildFile(global_flags, |
450 build_file_path, data, | 451 build_file_path, data, |
451 aux_data, variables, | 452 aux_data, variables, |
452 includes, depth, check): | 453 includes, depth, check): |
453 """Wrapper around LoadTargetBuildFile for parallel processing. | 454 """Wrapper around LoadTargetBuildFile for parallel processing. |
454 | 455 |
455 This wrapper is used when LoadTargetBuildFile is executed in | 456 This wrapper is used when LoadTargetBuildFile is executed in |
456 a worker process. | 457 a worker process. |
457 """ | 458 """ |
458 | 459 |
| 460 signal.signal(signal.SIGINT, signal.SIG_IGN) |
| 461 |
459 # Apply globals so that the worker process behaves the same. | 462 # Apply globals so that the worker process behaves the same. |
460 for key, value in global_flags.iteritems(): | 463 for key, value in global_flags.iteritems(): |
461 globals()[key] = value | 464 globals()[key] = value |
462 | 465 |
463 # Save the keys so we can return data that changed. | 466 # Save the keys so we can return data that changed. |
464 data_keys = set(data) | 467 data_keys = set(data) |
465 aux_data_keys = set(aux_data) | 468 aux_data_keys = set(aux_data) |
466 | 469 |
467 result = LoadTargetBuildFile(build_file_path, data, | 470 result = LoadTargetBuildFile(build_file_path, data, |
468 aux_data, variables, | 471 aux_data, variables, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 def LoadTargetBuildFileParallel(build_file_path, data, aux_data, | 543 def LoadTargetBuildFileParallel(build_file_path, data, aux_data, |
541 variables, includes, depth, check): | 544 variables, includes, depth, check): |
542 parallel_state = ParallelState() | 545 parallel_state = ParallelState() |
543 parallel_state.condition = threading.Condition() | 546 parallel_state.condition = threading.Condition() |
544 parallel_state.dependencies = [build_file_path] | 547 parallel_state.dependencies = [build_file_path] |
545 parallel_state.scheduled = set([build_file_path]) | 548 parallel_state.scheduled = set([build_file_path]) |
546 parallel_state.pending = 0 | 549 parallel_state.pending = 0 |
547 parallel_state.data = data | 550 parallel_state.data = data |
548 parallel_state.aux_data = aux_data | 551 parallel_state.aux_data = aux_data |
549 | 552 |
550 parallel_state.condition.acquire() | 553 try: |
551 while parallel_state.dependencies or parallel_state.pending: | 554 parallel_state.condition.acquire() |
552 if not parallel_state.dependencies: | 555 while parallel_state.dependencies or parallel_state.pending: |
553 parallel_state.condition.wait() | 556 if not parallel_state.dependencies: |
554 continue | 557 parallel_state.condition.wait() |
| 558 continue |
555 | 559 |
556 dependency = parallel_state.dependencies.pop() | 560 dependency = parallel_state.dependencies.pop() |
557 | 561 |
558 parallel_state.pending += 1 | 562 parallel_state.pending += 1 |
559 data_in = {} | 563 data_in = {} |
560 data_in['target_build_files'] = data['target_build_files'] | 564 data_in['target_build_files'] = data['target_build_files'] |
561 aux_data_in = {} | 565 aux_data_in = {} |
562 global_flags = { | 566 global_flags = { |
563 'path_sections': globals()['path_sections'], | 567 'path_sections': globals()['path_sections'], |
564 'non_configuration_keys': globals()['non_configuration_keys'], | 568 'non_configuration_keys': globals()['non_configuration_keys'], |
565 'absolute_build_file_paths': globals()['absolute_build_file_paths'], | 569 'absolute_build_file_paths': globals()['absolute_build_file_paths'], |
566 'multiple_toolsets': globals()['multiple_toolsets']} | 570 'multiple_toolsets': globals()['multiple_toolsets']} |
567 | 571 |
568 if not parallel_state.pool: | 572 if not parallel_state.pool: |
569 parallel_state.pool = multiprocessing.Pool(8) | 573 parallel_state.pool = multiprocessing.Pool(8) |
570 parallel_state.pool.apply_async( | 574 parallel_state.pool.apply_async( |
571 CallLoadTargetBuildFile, | 575 CallLoadTargetBuildFile, |
572 args = (global_flags, dependency, | 576 args = (global_flags, dependency, |
573 data_in, aux_data_in, | 577 data_in, aux_data_in, |
574 variables, includes, depth, check), | 578 variables, includes, depth, check), |
575 callback = parallel_state.LoadTargetBuildFileCallback) | 579 callback = parallel_state.LoadTargetBuildFileCallback) |
| 580 except KeyboardInterrupt, e: |
| 581 parallel_state.pool.terminate() |
| 582 raise e |
576 | 583 |
577 parallel_state.condition.release() | 584 parallel_state.condition.release() |
578 | 585 |
579 | 586 |
580 # Look for the bracket that matches the first bracket seen in a | 587 # Look for the bracket that matches the first bracket seen in a |
581 # string, and return the start and end as a tuple. For example, if | 588 # string, and return the start and end as a tuple. For example, if |
582 # the input is something like "<(foo <(bar)) blah", then it would | 589 # the input is something like "<(foo <(bar)) blah", then it would |
583 # return (1, 13), indicating the entire string except for the leading | 590 # return (1, 13), indicating the entire string except for the leading |
584 # "<" and trailing " blah". | 591 # "<" and trailing " blah". |
585 def FindEnclosingBracketGroup(input): | 592 def FindEnclosingBracketGroup(input): |
(...skipping 2042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2628 ValidateRunAsInTarget(target, target_dict, build_file) | 2635 ValidateRunAsInTarget(target, target_dict, build_file) |
2629 ValidateActionsInTarget(target, target_dict, build_file) | 2636 ValidateActionsInTarget(target, target_dict, build_file) |
2630 | 2637 |
2631 # Generators might not expect ints. Turn them into strs. | 2638 # Generators might not expect ints. Turn them into strs. |
2632 TurnIntIntoStrInDict(data) | 2639 TurnIntIntoStrInDict(data) |
2633 | 2640 |
2634 # TODO(mark): Return |data| for now because the generator needs a list of | 2641 # TODO(mark): Return |data| for now because the generator needs a list of |
2635 # build files that came in. In the future, maybe it should just accept | 2642 # build files that came in. In the future, maybe it should just accept |
2636 # a list, and not the whole data dict. | 2643 # a list, and not the whole data dict. |
2637 return [flat_list, targets, data] | 2644 return [flat_list, targets, data] |
OLD | NEW |