|
13 | 13 | import warnings
|
14 | 14 | from textwrap import fill
|
15 | 15 |
|
16 |
| - |
17 | 16 | PY3 = (sys.version_info[0] >= 3)
|
18 | 17 |
|
19 | 18 |
|
@@ -1788,16 +1787,26 @@ def check_requirements(self):
|
1788 | 1787 | except:
|
1789 | 1788 | return "unknown (can not use multiprocessing to determine)"
|
1790 | 1789 | try:
|
1791 |
| - success, msg = p.map(backend_gtk3agg_internal_check, [0])[0] |
| 1790 | + res = p.map_async(backend_gtk3agg_internal_check, [0]) |
| 1791 | + success, msg = res.get(timeout=10)[0] |
| 1792 | + except multiprocessing.TimeoutError: |
| 1793 | + p.terminate() |
| 1794 | + # No result returned. Probaly hanging, terminate the process. |
| 1795 | + success = False |
| 1796 | + raise CheckFailed("Check timed out") |
1792 | 1797 | except:
|
| 1798 | + p.close() |
| 1799 | + # Some other error. |
1793 | 1800 | success = False
|
1794 | 1801 | msg = "Could not determine"
|
1795 |
| - finally: |
| 1802 | + raise |
| 1803 | + else: |
1796 | 1804 | p.close()
|
| 1805 | + finally: |
1797 | 1806 | p.join()
|
| 1807 | + |
1798 | 1808 | if success:
|
1799 | 1809 | BackendAgg.force = True
|
1800 |
| - |
1801 | 1810 | return msg
|
1802 | 1811 | else:
|
1803 | 1812 | raise CheckFailed(msg)
|
@@ -1852,12 +1861,25 @@ def check_requirements(self):
|
1852 | 1861 | p = multiprocessing.Pool()
|
1853 | 1862 | except:
|
1854 | 1863 | return "unknown (can not use multiprocessing to determine)"
|
1855 |
| - success, msg = p.map(backend_gtk3cairo_internal_check, [0])[0] |
1856 |
| - p.close() |
1857 |
| - p.join() |
| 1864 | + try: |
| 1865 | + res = p.map_async(backend_gtk3cairo_internal_check, [0]) |
| 1866 | + success, msg = res.get(timeout=10)[0] |
| 1867 | + except multiprocessing.TimeoutError: |
| 1868 | + p.terminate() |
| 1869 | + # No result returned. Probaly hanging, terminate the process. |
| 1870 | + success = False |
| 1871 | + raise CheckFailed("Check timed out") |
| 1872 | + except: |
| 1873 | + p.close() |
| 1874 | + success = False |
| 1875 | + raise |
| 1876 | + else: |
| 1877 | + p.close() |
| 1878 | + finally: |
| 1879 | + p.join() |
| 1880 | + |
1858 | 1881 | if success:
|
1859 | 1882 | BackendAgg.force = True
|
1860 |
| - |
1861 | 1883 | return msg
|
1862 | 1884 | else:
|
1863 | 1885 | raise CheckFailed(msg)
|
@@ -1988,13 +2010,21 @@ def check_requirements(self):
|
1988 | 2010 | else:
|
1989 | 2011 | # Multiprocessing OK
|
1990 | 2012 | try:
|
1991 |
| - msg = p.map(self.callback, [self])[0] |
| 2013 | + res = p.map_async(self.callback, [self]) |
| 2014 | + msg = res.get(timeout=10)[0] |
| 2015 | + except multiprocessing.TimeoutError: |
| 2016 | + p.terminate() |
| 2017 | + # No result returned. Probaly hanging, terminate the process. |
| 2018 | + raise CheckFailed("Check timed out") |
1992 | 2019 | except:
|
1993 |
| - # If we hit an error on multiprocessing raise it |
| 2020 | + # Some other error. |
| 2021 | + p.close() |
1994 | 2022 | raise
|
| 2023 | + else: |
| 2024 | + # Clean exit |
| 2025 | + p.close() |
1995 | 2026 | finally:
|
1996 | 2027 | # Tidy up multiprocessing
|
1997 |
| - p.close() |
1998 | 2028 | p.join()
|
1999 | 2029 |
|
2000 | 2030 | return msg
|
|
0 commit comments