buildframework/helium/sf/python/pythoncore/lib/timeout_launcher.py
changeset 587 85df38eb4012
child 588 c7c26511138f
equal deleted inserted replaced
217:0f5e3a7fb6af 587:85df38eb4012
       
     1 #============================================================================ 
       
     2 #Name        : timeout_launcher.py 
       
     3 #Part of     : Helium 
       
     4 
       
     5 #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     6 #All rights reserved.
       
     7 #This component and the accompanying materials are made available
       
     8 #under the terms of the License "Eclipse Public License v1.0"
       
     9 #which accompanies this distribution, and is available
       
    10 #at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
    11 #
       
    12 #Initial Contributors:
       
    13 #Nokia Corporation - initial contribution.
       
    14 #
       
    15 #Contributors:
       
    16 #
       
    17 #Description:
       
    18 #===============================================================================
       
    19 
       
    20 """ Application launcher supporting timeout. """
       
    21 import os
       
    22 import sys
       
    23 import re
       
    24 import subprocess
       
    25 import logging
       
    26 import time
       
    27 
       
    28 _logger = logging.getLogger('timeout_launcher')
       
    29 logging.basicConfig(level=logging.INFO)
       
    30 
       
    31 
       
    32 # Platform
       
    33 windows = False
       
    34 if sys.platform == "win32":
       
    35     import win32process
       
    36     import win32con
       
    37     import win32api
       
    38     windows = True
       
    39 
       
    40 def main():
       
    41     cmdarg = False
       
    42     cmdline = []
       
    43     timeout = None
       
    44     
       
    45     for arg in sys.argv:
       
    46         res = re.match("^--timeout=(\d+)$", arg)
       
    47         if not cmdarg and res is not None:
       
    48             timeout = int(res.group(1))
       
    49             _logger.debug("Set timeout to %s" % timeout)
       
    50         elif not cmdarg and arg == '--':
       
    51             _logger.debug("Parsing command start")
       
    52             cmdarg = True
       
    53         elif cmdarg:
       
    54             _logger.debug("Adding arg: %s" % arg)
       
    55             cmdline.append(arg)
       
    56     
       
    57     if len(cmdline) == 0:
       
    58         print "Empty command line."
       
    59         print "e.g: timeout_launcher.py --timeout=1 -- cmd /c sleep 10"
       
    60         sys.exit(-1)
       
    61     else:
       
    62         _logger.debug("Start command")
       
    63         if timeout != None:
       
    64             finish = time.time() + timeout
       
    65             timedout = False
       
    66             shell = True
       
    67             if windows:
       
    68                 shell = False
       
    69             p = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
       
    70             while (p.poll() == None):
       
    71                 if time.time() > finish:
       
    72                     timedout = True
       
    73                     break
       
    74                 time.sleep(1)
       
    75             if timedout:
       
    76                 print "ERROR: Application has timed out (timeout=%s)." % timeout
       
    77                 if windows:
       
    78                     try:
       
    79                         print "ERROR: Trying to kill the process..."
       
    80                         handle = win32api.OpenProcess(True, win32con.PROCESS_TERMINATE, p.pid)
       
    81                         win32process.TerminateProcess(handle, -1)
       
    82                         print "ERROR: Process killed..."
       
    83                     except Exception, exc:
       
    84                         print "ERROR: %s" % exc
       
    85                 else:
       
    86                     # pylint: disable-msg=E1101
       
    87                     os.kill(p.pid, 9)
       
    88                 print "ERROR: exiting..."
       
    89                 raise Exception("Timeout exception.")
       
    90             else:
       
    91                 print p.communicate()[0]
       
    92                 sys.exit(p.returncode)
       
    93         else:
       
    94             p = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
       
    95             print p.communicate()[0]
       
    96             sys.exit(p.returncode)
       
    97 
       
    98 if __name__ == '__main__':
       
    99     main()