]> granicus.if.org Git - python/commitdiff
Issue #23191: fnmatch functions that use caching are now threadsafe.
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 27 Jan 2015 09:40:51 +0000 (11:40 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 27 Jan 2015 09:40:51 +0000 (11:40 +0200)
Lib/fnmatch.py
Misc/NEWS

index ffe99b5762db0116b23f3008c7de54d49681a84c..99002e6e6bc20cf12df1f531e057dfa716b0e4f3 100644 (file)
@@ -47,12 +47,14 @@ def filter(names, pat):
     import os,posixpath
     result=[]
     pat=os.path.normcase(pat)
-    if not pat in _cache:
+    try:
+        re_pat = _cache[pat]
+    except KeyError:
         res = translate(pat)
         if len(_cache) >= _MAXCACHE:
             _cache.clear()
-        _cache[pat] = re.compile(res)
-    match=_cache[pat].match
+        _cache[pat] = re_pat = re.compile(res)
+    match = re_pat.match
     if os.path is posixpath:
         # normcase on posix is NOP. Optimize it away from the loop.
         for name in names:
@@ -71,12 +73,14 @@ def fnmatchcase(name, pat):
     its arguments.
     """
 
-    if not pat in _cache:
+    try:
+        re_pat = _cache[pat]
+    except KeyError:
         res = translate(pat)
         if len(_cache) >= _MAXCACHE:
             _cache.clear()
-        _cache[pat] = re.compile(res)
-    return _cache[pat].match(name) is not None
+        _cache[pat] = re_pat = re.compile(res)
+    return re_pat.match(name) is not None
 
 def translate(pat):
     """Translate a shell PATTERN to a regular expression.
index 6e466e465988abab42361013e84902cc69db84d8..593b70b6cb9d38a910006ec46ff421e7924b9aaf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #23191: fnmatch functions that use caching are now threadsafe.
+
 - Issue #18518: timeit now rejects statements which can't be compiled outside
   a function or a loop (e.g. "return" or "break").