From b3663173b5804000820eceecb3dc78106f7b8e1d Mon Sep 17 00:00:00 2001 From: Michael Vincent Date: Fri, 9 Apr 2021 13:53:20 -0500 Subject: [PATCH] gccdeps: Refactor cache lock Rework how gccdeps' cached_nodes lock is used so acquiring the lock is only necessary on a cache miss. Also use a "with" context manager to simplify management of the lock lifecycle. Ported from 8b5a2a2086dd67070ff26b6c65019bcbbea18836 --- waflib/extras/gccdeps.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/waflib/extras/gccdeps.py b/waflib/extras/gccdeps.py index 761b274b..9e9952f2 100644 --- a/waflib/extras/gccdeps.py +++ b/waflib/extras/gccdeps.py @@ -54,14 +54,17 @@ def path_to_node(base_node, path, cached_nodes): else: # Not hashable, assume it is a list and join into a string node_lookup_key = (base_node, os.path.sep.join(path)) + try: - lock.acquire() node = cached_nodes[node_lookup_key] except KeyError: - node = base_node.find_resource(path) - cached_nodes[node_lookup_key] = node - finally: - lock.release() + # retry with lock on cache miss + with lock: + try: + node = cached_nodes[node_lookup_key] + except KeyError: + node = cached_nodes[node_lookup_key] = base_node.find_resource(path) + return node def post_run(self):