daltenty updated this revision to Diff 208805.
daltenty added a comment.

- Use subprocess.call instead of importing it
- Create killProcessAndChildrenIsSupported check and rewrite things to use it


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
@@ -433,24 +433,29 @@
     our dependency on it.
 
     """
-    import psutil
-    try:
-        psutilProc = psutil.Process(pid)
-        # Handle the different psutil API versions
+    import platform
+
+    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,27 @@
         """
         return self._maxIndividualTestTime
 
+    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.
+        """
+        if platform.system() == 'AIX':
+            return (True, "")
+        try:
+            import psutil  # noqa: F401
+            self.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.")
+
     @maxIndividualTestTime.setter
     def maxIndividualTestTime(self, value):
         """
@@ -86,16 +108,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

Reply via email to