1*9e94795aSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*9e94795aSAndroid Build Coastguard Worker# 3*9e94795aSAndroid Build Coastguard Worker# Copyright (C) 2019 The Android Open Source Project 4*9e94795aSAndroid Build Coastguard Worker# 5*9e94795aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*9e94795aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*9e94795aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*9e94795aSAndroid Build Coastguard Worker# 9*9e94795aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*9e94795aSAndroid Build Coastguard Worker# 11*9e94795aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*9e94795aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*9e94795aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*9e94795aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*9e94795aSAndroid Build Coastguard Worker# limitations under the License. 16*9e94795aSAndroid Build Coastguard Worker 17*9e94795aSAndroid Build Coastguard Worker"""Simple wrapper to run warn_common with Python standard Pool.""" 18*9e94795aSAndroid Build Coastguard Worker 19*9e94795aSAndroid Build Coastguard Workerimport multiprocessing 20*9e94795aSAndroid Build Coastguard Workerimport signal 21*9e94795aSAndroid Build Coastguard Workerimport sys 22*9e94795aSAndroid Build Coastguard Worker 23*9e94795aSAndroid Build Coastguard Worker# pylint:disable=relative-beyond-top-level,no-name-in-module 24*9e94795aSAndroid Build Coastguard Worker# suppress false positive of no-name-in-module warnings 25*9e94795aSAndroid Build Coastguard Workerfrom . import warn_common as common 26*9e94795aSAndroid Build Coastguard Worker 27*9e94795aSAndroid Build Coastguard Worker 28*9e94795aSAndroid Build Coastguard Workerdef classify_warnings(args): 29*9e94795aSAndroid Build Coastguard Worker """Classify a list of warning lines. 30*9e94795aSAndroid Build Coastguard Worker 31*9e94795aSAndroid Build Coastguard Worker Args: 32*9e94795aSAndroid Build Coastguard Worker args: dictionary { 33*9e94795aSAndroid Build Coastguard Worker 'group': list of (warning, link), 34*9e94795aSAndroid Build Coastguard Worker 'project_patterns': re.compile(project_list[p][1]), 35*9e94795aSAndroid Build Coastguard Worker 'warn_patterns': list of warn_pattern, 36*9e94795aSAndroid Build Coastguard Worker 'num_processes': number of processes being used for multiprocessing } 37*9e94795aSAndroid Build Coastguard Worker Returns: 38*9e94795aSAndroid Build Coastguard Worker results: a list of the classified warnings. 39*9e94795aSAndroid Build Coastguard Worker """ 40*9e94795aSAndroid Build Coastguard Worker results = [] 41*9e94795aSAndroid Build Coastguard Worker for line, link in args['group']: 42*9e94795aSAndroid Build Coastguard Worker common.classify_one_warning(line, link, results, args['project_patterns'], 43*9e94795aSAndroid Build Coastguard Worker args['warn_patterns']) 44*9e94795aSAndroid Build Coastguard Worker 45*9e94795aSAndroid Build Coastguard Worker # After the main work, ignore all other signals to a child process, 46*9e94795aSAndroid Build Coastguard Worker # to avoid bad warning/error messages from the exit clean-up process. 47*9e94795aSAndroid Build Coastguard Worker if args['num_processes'] > 1: 48*9e94795aSAndroid Build Coastguard Worker signal.signal(signal.SIGTERM, lambda *args: sys.exit(-signal.SIGTERM)) 49*9e94795aSAndroid Build Coastguard Worker return results 50*9e94795aSAndroid Build Coastguard Worker 51*9e94795aSAndroid Build Coastguard Worker 52*9e94795aSAndroid Build Coastguard Workerdef create_and_launch_subprocesses(num_cpu, classify_warnings_fn, arg_groups, 53*9e94795aSAndroid Build Coastguard Worker group_results): 54*9e94795aSAndroid Build Coastguard Worker """Fork num_cpu processes to classify warnings.""" 55*9e94795aSAndroid Build Coastguard Worker pool = multiprocessing.Pool(num_cpu) 56*9e94795aSAndroid Build Coastguard Worker for cpu in range(num_cpu): 57*9e94795aSAndroid Build Coastguard Worker proc_result = pool.map(classify_warnings_fn, arg_groups[cpu]) 58*9e94795aSAndroid Build Coastguard Worker if proc_result is not None: 59*9e94795aSAndroid Build Coastguard Worker group_results.append(proc_result) 60*9e94795aSAndroid Build Coastguard Worker return group_results 61*9e94795aSAndroid Build Coastguard Worker 62*9e94795aSAndroid Build Coastguard Worker 63*9e94795aSAndroid Build Coastguard Workerdef main(): 64*9e94795aSAndroid Build Coastguard Worker """Old main() calls new common_main.""" 65*9e94795aSAndroid Build Coastguard Worker use_google3 = False 66*9e94795aSAndroid Build Coastguard Worker common.common_main(use_google3, create_and_launch_subprocesses, 67*9e94795aSAndroid Build Coastguard Worker classify_warnings) 68*9e94795aSAndroid Build Coastguard Worker 69*9e94795aSAndroid Build Coastguard Worker 70*9e94795aSAndroid Build Coastguard Workerif __name__ == '__main__': 71*9e94795aSAndroid Build Coastguard Worker main() 72