From 7d834a571ac8d97b12707f03ff5c2af5129b7b04 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Mon, 27 Apr 2009 21:01:13 +0000 Subject: [PATCH] Merged revisions 72045 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72045 | antoine.pitrou | 2009-04-27 22:50:20 +0200 (lun., 27 avril 2009) | 5 lines Issue #5853: calling a function of the mimetypes module from several threads at once could hit the recursion limit if the mimetypes database hadn't been initialized before. ........ --- Lib/mimetypes.py | 28 +++++++++++++--------------- Misc/NEWS | 4 ++++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py index 6212e78419..f0a5ecf7bb 100644 --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -44,6 +44,7 @@ knownfiles = [ ] inited = False +_db = None class MimeTypes: @@ -237,9 +238,9 @@ def guess_type(url, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_type(url, strict) + return _db.guess_type(url, strict) def guess_all_extensions(type, strict=True): @@ -255,9 +256,9 @@ def guess_all_extensions(type, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_all_extensions(type, strict) + return _db.guess_all_extensions(type, strict) def guess_extension(type, strict=True): """Guess the extension for a file based on its MIME type. @@ -271,9 +272,9 @@ def guess_extension(type, strict=True): Optional `strict' argument when false adds a bunch of commonly found, but non-standard types. """ - if not inited: + if _db is None: init() - return guess_extension(type, strict) + return _db.guess_extension(type, strict) def add_type(type, ext, strict=True): """Add a mapping between a type and an extension. @@ -287,16 +288,15 @@ def add_type(type, ext, strict=True): list of standard types, else to the list of non-standard types. """ - if not inited: + if _db is None: init() - return add_type(type, ext, strict) + return _db.add_type(type, ext, strict) def init(files=None): - global guess_all_extensions, guess_extension, guess_type global suffix_map, types_map, encodings_map, common_types - global add_type, inited - inited = True + global inited, _db + inited = True # so that MimeTypes.__init__() doesn't call us again db = MimeTypes() if files is None: files = knownfiles @@ -306,11 +306,9 @@ def init(files=None): encodings_map = db.encodings_map suffix_map = db.suffix_map types_map = db.types_map[True] - guess_all_extensions = db.guess_all_extensions - guess_extension = db.guess_extension - guess_type = db.guess_type - add_type = db.add_type common_types = db.types_map[False] + # Make the DB a global variable now that it is fully initialized + _db = db def read_mime_types(file): diff --git a/Misc/NEWS b/Misc/NEWS index e44f22ab8f..d5a6a16462 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,10 @@ Core and Builtins Library ------- +- Issue #5853: calling a function of the mimetypes module from several threads + at once could hit the recursion limit if the mimetypes database hadn't been + initialized before. + - Issue #5041: ctypes does now allow pickling wide character. - Issue #5768: Fixed bug in Unicode output logic and test case for same. -- 2.40.0