From 7fc497d6c62804c32104208103be1c212a5f48eb Mon Sep 17 00:00:00 2001 From: Jens Hedegaard Nielsen Date: Wed, 29 Oct 2014 19:32:42 +0000 Subject: [PATCH 1/2] Use map_async and get to avoid a deadlock --- setupext.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/setupext.py b/setupext.py index 06ad614cb4d0..20814cf6d78b 100755 --- a/setupext.py +++ b/setupext.py @@ -1717,7 +1717,8 @@ def check_requirements(self): except: return "unknown (can not use multiprocessing to determine)" try: - success, msg = p.map(backend_gtk3agg_internal_check, [0])[0] + res = p.map_async(backend_gtk3agg_internal_check, [0]) + success, msg = res.get(timeout=5)[0] except: success = False msg = "Could not determine" @@ -1781,7 +1782,8 @@ def check_requirements(self): p = multiprocessing.Pool() except: return "unknown (can not use multiprocessing to determine)" - success, msg = p.map(backend_gtk3cairo_internal_check, [0])[0] + res = p.map_async(backend_gtk3cairo_internal_check, [0]) + success, msg = res.get(timeout=5)[0] p.close() p.join() if success: @@ -1916,7 +1918,8 @@ def check_requirements(self): else: # Multiprocessing OK try: - msg = p.map(self.callback, [self])[0] + res = p.map_async(self.callback, [self]) + msg = res.get(timeout=5)[0] except: # If we hit an error on multiprocessing raise it raise From 68e7c91a626e138f723a48d57c8a6adae456c806 Mon Sep 17 00:00:00 2001 From: Jens Hedegaard Nielsen Date: Wed, 29 Oct 2014 19:37:16 +0000 Subject: [PATCH 2/2] Wrap gtk3cairo test in try except --- setupext.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/setupext.py b/setupext.py index 20814cf6d78b..8c01bbe32ab1 100755 --- a/setupext.py +++ b/setupext.py @@ -1782,10 +1782,15 @@ def check_requirements(self): p = multiprocessing.Pool() except: return "unknown (can not use multiprocessing to determine)" - res = p.map_async(backend_gtk3cairo_internal_check, [0]) - success, msg = res.get(timeout=5)[0] - p.close() - p.join() + try: + res = p.map_async(backend_gtk3cairo_internal_check, [0]) + success, msg = res.get(timeout=5)[0] + except: + success = False + raise + finally: + p.close() + p.join() if success: BackendAgg.force = True