1*f5c631daSSadaf Ebrahimi#!/usr/bin/env python2.7 2*f5c631daSSadaf Ebrahimi 3*f5c631daSSadaf Ebrahimi# Copyright 2019, VIXL authors 4*f5c631daSSadaf Ebrahimi# All rights reserved. 5*f5c631daSSadaf Ebrahimi# 6*f5c631daSSadaf Ebrahimi# Redistribution and use in source and binary forms, with or without 7*f5c631daSSadaf Ebrahimi# modification, are permitted provided that the following conditions are met: 8*f5c631daSSadaf Ebrahimi# 9*f5c631daSSadaf Ebrahimi# * Redistributions of source code must retain the above copyright notice, 10*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer. 11*f5c631daSSadaf Ebrahimi# * Redistributions in binary form must reproduce the above copyright notice, 12*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer in the documentation 13*f5c631daSSadaf Ebrahimi# and/or other materials provided with the distribution. 14*f5c631daSSadaf Ebrahimi# * Neither the name of ARM Limited nor the names of its contributors may be 15*f5c631daSSadaf Ebrahimi# used to endorse or promote products derived from this software without 16*f5c631daSSadaf Ebrahimi# specific prior written permission. 17*f5c631daSSadaf Ebrahimi# 18*f5c631daSSadaf Ebrahimi# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 19*f5c631daSSadaf Ebrahimi# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20*f5c631daSSadaf Ebrahimi# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21*f5c631daSSadaf Ebrahimi# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 22*f5c631daSSadaf Ebrahimi# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*f5c631daSSadaf Ebrahimi# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24*f5c631daSSadaf Ebrahimi# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25*f5c631daSSadaf Ebrahimi# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26*f5c631daSSadaf Ebrahimi# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*f5c631daSSadaf Ebrahimi# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*f5c631daSSadaf Ebrahimi 29*f5c631daSSadaf Ebrahimiimport multiprocessing 30*f5c631daSSadaf Ebrahimiimport signal 31*f5c631daSSadaf Ebrahimiimport sys 32*f5c631daSSadaf Ebrahimi 33*f5c631daSSadaf Ebrahimi# Catch SIGINT to gracefully exit when ctrl+C is pressed. 34*f5c631daSSadaf Ebrahimidef SigIntHandler(signal, frame): 35*f5c631daSSadaf Ebrahimi sys.exit(1) 36*f5c631daSSadaf Ebrahimi 37*f5c631daSSadaf Ebrahimisignal.signal(signal.SIGINT, SigIntHandler) 38*f5c631daSSadaf Ebrahimi 39*f5c631daSSadaf Ebrahimi# This function can't run in parallel due to constraints from the 40*f5c631daSSadaf Ebrahimi# multiprocessing module. 41*f5c631daSSadaf Ebrahimi__run_tests_lock__ = multiprocessing.Lock() 42*f5c631daSSadaf Ebrahimidef Multithread(function, list_of_args, num_threads=1, init_function=None): 43*f5c631daSSadaf Ebrahimi with __run_tests_lock__: 44*f5c631daSSadaf Ebrahimi if init_function: 45*f5c631daSSadaf Ebrahimi if not init_function(): 46*f5c631daSSadaf Ebrahimi # Init failed: early exit 47*f5c631daSSadaf Ebrahimi return 48*f5c631daSSadaf Ebrahimi 49*f5c631daSSadaf Ebrahimi pool = multiprocessing.Pool(num_threads) 50*f5c631daSSadaf Ebrahimi # The '.get(9999999)' is a workaround to allow killing the test script with 51*f5c631daSSadaf Ebrahimi # ctrl+C from the shell. This bug is documented at 52*f5c631daSSadaf Ebrahimi # http://bugs.python.org/issue8296. 53*f5c631daSSadaf Ebrahimi pool.map_async(function, list_of_args).get(9999999) 54*f5c631daSSadaf Ebrahimi pool.close() 55*f5c631daSSadaf Ebrahimi pool.join() 56