daltenty updated this revision to Diff 209409. daltenty added a comment. - Address review comments round 2
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D64251/new/ https://reviews.llvm.org/D64251 Files: libcxx/utils/libcxx/util.py lldb/lit/lit.cfg.py llvm/utils/lit/lit/LitConfig.py llvm/utils/lit/lit/util.py llvm/utils/lit/tests/googletest-timeout.py llvm/utils/lit/tests/lit.cfg llvm/utils/lit/tests/shtest-timeout.py
Index: llvm/utils/lit/tests/shtest-timeout.py =================================================================== --- llvm/utils/lit/tests/shtest-timeout.py +++ llvm/utils/lit/tests/shtest-timeout.py @@ -1,4 +1,4 @@ -# REQUIRES: python-psutil +# REQUIRES: lit-max-individual-test-time # llvm.org/PR33944 # UNSUPPORTED: system-windows Index: llvm/utils/lit/tests/lit.cfg =================================================================== --- llvm/utils/lit/tests/lit.cfg +++ llvm/utils/lit/tests/lit.cfg @@ -1,6 +1,7 @@ # -*- Python -*- import os +import platform import sys import lit.formats @@ -56,10 +57,10 @@ os.path.dirname(__file__), ".coveragerc") # Add a feature to detect if psutil is available -try: - import psutil - lit_config.note('Found python psutil module') - config.available_features.add("python-psutil") -except ImportError: - lit_config.warning('Could not import psutil. Some tests will be skipped and' - ' the --timeout command line argument will not work.') +supported, errormsg = lit_config.killProcessAndChildrenIsSupported +if supported: + config.available_features.add("lit-max-individual-test-time") +else: + lit_config.warning('Setting a timeout per test not supported. ' + errormsg + + ' Some tests will be skipped and the --timeout' + ' command line argument will not work.') Index: llvm/utils/lit/tests/googletest-timeout.py =================================================================== --- llvm/utils/lit/tests/googletest-timeout.py +++ llvm/utils/lit/tests/googletest-timeout.py @@ -1,4 +1,4 @@ -# REQUIRES: python-psutil +# REQUIRES: lit-max-individual-test-time # Check that the per test timeout is enforced when running GTest tests. # Index: llvm/utils/lit/lit/util.py =================================================================== --- llvm/utils/lit/lit/util.py +++ llvm/utils/lit/lit/util.py @@ -423,6 +423,26 @@ return out return None +def killProcessAndChildrenIsSupported(llvm_config): + """ + Returns a tuple (<supported> , <error message>) + where + `<supported>` is True if `killProcessAndChildren()` is supported on + the current host, returns False otherwise. + `<error message>` is an empty string if `<supported>` is True, + otherwise is contains a string describing why the function is + not supported. + """ + if platform.system() == 'AIX': + return (True, "") + try: + import psutil # noqa: F401 + llvm_config.note('Found python psutil module') + return (True, "") + except ImportError: + return (False, "Requires the Python psutil module but it could" + " not be found. Try installing it via pip or via" + " your operating system's package manager.") def killProcessAndChildren(pid): """This function kills a process with ``pid`` and all its running children @@ -433,24 +453,27 @@ our dependency on it. """ - import psutil - try: - psutilProc = psutil.Process(pid) - # Handle the different psutil API versions + if platform.system() == 'AIX': + subprocess.call('kill -kill $(ps -o pid= -L{})'.format(pid), shell=True) + else: + import psutil try: - # psutil >= 2.x - children_iterator = psutilProc.children(recursive=True) - except AttributeError: - # psutil 1.x - children_iterator = psutilProc.get_children(recursive=True) - for child in children_iterator: + psutilProc = psutil.Process(pid) + # Handle the different psutil API versions try: - child.kill() - except psutil.NoSuchProcess: - pass - psutilProc.kill() - except psutil.NoSuchProcess: - pass + # psutil >= 2.x + children_iterator = psutilProc.children(recursive=True) + except AttributeError: + # psutil 1.x + children_iterator = psutilProc.get_children(recursive=True) + for child in children_iterator: + try: + child.kill() + except psutil.NoSuchProcess: + pass + psutilProc.kill() + except psutil.NoSuchProcess: + pass try: Index: llvm/utils/lit/lit/LitConfig.py =================================================================== --- llvm/utils/lit/lit/LitConfig.py +++ llvm/utils/lit/lit/LitConfig.py @@ -1,6 +1,7 @@ from __future__ import absolute_import import inspect import os +import platform import sys import lit.Test @@ -76,6 +77,19 @@ """ return self._maxIndividualTestTime + @property + def killProcessAndChildrenIsSupported(self): + """ + Returns a tuple (<supported> , <error message>) + where + `<supported>` is True if `killProcessAndChildren()` is supported on + the current host, returns False otherwise. + `<error message>` is an empty string if `<supported>` is True, + otherwise is contains a string describing why the function is + not supported. + """ + return lit.util.killProcessAndChildrenIsSupported(self) + @maxIndividualTestTime.setter def maxIndividualTestTime(self, value): """ @@ -86,16 +100,13 @@ self.fatal('maxIndividualTestTime must set to a value of type int.') self._maxIndividualTestTime = value if self.maxIndividualTestTime > 0: - # The current implementation needs psutil to set + # The current implementation needs psutil on some platforms to set # a timeout per test. Check it's available. # See lit.util.killProcessAndChildren() - try: - import psutil # noqa: F401 - except ImportError: - self.fatal("Setting a timeout per test requires the" - " Python psutil module but it could not be" - " found. Try installing it via pip or via" - " your operating system's package manager.") + supported, errormsg = self.killProcessAndChildrenIsSupported + if not supported: + self.fatal('Setting a timeout per test not supported. ' + + errormsg) elif self.maxIndividualTestTime < 0: self.fatal('The timeout per test must be >= 0 seconds') Index: lldb/lit/lit.cfg.py =================================================================== --- lldb/lit/lit.cfg.py +++ lldb/lit/lit.cfg.py @@ -1,6 +1,7 @@ # -*- Python -*- import os +import platform import re import shutil import site @@ -75,13 +76,10 @@ shutil.rmtree(cachedir) # Set a default per-test timeout of 10 minutes. Setting a timeout per test -# requires the psutil module and lit complains if the value is set but the -# module can't be found. -try: - import psutil # noqa: F401 +# requires that killProcessAndChildren() is supported on the platform and +# lit complains if the value is set but it is not supported. +if lit_config.killProcessAndChildrenIsSupported(): lit_config.maxIndividualTestTime = 600 -except ImportError: - pass # If running tests natively, check for CPU features needed for some tests. Index: libcxx/utils/libcxx/util.py =================================================================== --- libcxx/utils/libcxx/util.py +++ libcxx/utils/libcxx/util.py @@ -253,24 +253,27 @@ TODO: Reimplement this without using psutil so we can remove our dependency on it. """ - import psutil - try: - psutilProc = psutil.Process(pid) - # Handle the different psutil API versions + if platform.system() == 'AIX': + subprocess.call('kill -kill $(ps -o pid= -L{})'.format(pid), shell=True) + else: + import psutil try: - # psutil >= 2.x - children_iterator = psutilProc.children(recursive=True) - except AttributeError: - # psutil 1.x - children_iterator = psutilProc.get_children(recursive=True) - for child in children_iterator: + psutilProc = psutil.Process(pid) + # Handle the different psutil API versions try: - child.kill() - except psutil.NoSuchProcess: - pass - psutilProc.kill() - except psutil.NoSuchProcess: - pass + # psutil >= 2.x + children_iterator = psutilProc.children(recursive=True) + except AttributeError: + # psutil 1.x + children_iterator = psutilProc.get_children(recursive=True) + for child in children_iterator: + try: + child.kill() + except psutil.NoSuchProcess: + pass + psutilProc.kill() + except psutil.NoSuchProcess: + pass def executeCommandVerbose(cmd, *args, **kwargs):
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits