From: Raymond Hettinger Date: Wed, 14 Jul 2004 21:04:27 +0000 (+0000) Subject: Use threading.local() instead of threading.currentThread(). X-Git-Tag: v2.4a2~263 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ef66debd7ef590304466d13dde4082632750fa7c;p=python Use threading.local() instead of threading.currentThread(). --- diff --git a/Lib/decimal.py b/Lib/decimal.py index ba94d7a9ae..717c6b7f3b 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -374,30 +374,66 @@ _condition_map = {ConversionSyntax:InvalidOperation, ##### Context Functions ####################################### -#To fix reloading, force it to create a new context -#Old contexts have different exceptions in their dicts, making problems. -if hasattr(threading.currentThread(), '__decimal_context__'): - del threading.currentThread().__decimal_context__ - -def setcontext(context): - """Set this thread's context to context.""" - if context in (DefaultContext, BasicContext, ExtendedContext): - context = context.copy() - threading.currentThread().__decimal_context__ = context +# The getcontext() and setcontext() function manage access to a thread-local +# current context. Py2.4 offers direct support for thread locals. If that +# is not available, use threading.currentThread() which is slower but will +# work for older Pythons. -def getcontext(): - """Returns this thread's context. +try: + threading.local - If this thread does not yet have a context, returns - a new context and sets this thread's context. - New contexts are copies of DefaultContext. - """ - try: - return threading.currentThread().__decimal_context__ - except AttributeError: - context = Context() +except AttributeError: + + #To fix reloading, force it to create a new context + #Old contexts have different exceptions in their dicts, making problems. + if hasattr(threading.currentThread(), '__decimal_context__'): + del threading.currentThread().__decimal_context__ + + def setcontext(context): + """Set this thread's context to context.""" + if context in (DefaultContext, BasicContext, ExtendedContext): + context = context.copy() threading.currentThread().__decimal_context__ = context - return context + + def getcontext(): + """Returns this thread's context. + + If this thread does not yet have a context, returns + a new context and sets this thread's context. + New contexts are copies of DefaultContext. + """ + try: + return threading.currentThread().__decimal_context__ + except AttributeError: + context = Context() + threading.currentThread().__decimal_context__ = context + return context + +else: + + local = threading.local() + + def getcontext(_local=local): + """Returns this thread's context. + + If this thread does not yet have a context, returns + a new context and sets this thread's context. + New contexts are copies of DefaultContext. + """ + try: + return _local.__decimal_context__ + except AttributeError: + context = Context() + _local.__decimal_context__ = context + return context + + def setcontext(context, _local=local): + """Set this thread's context to context.""" + if context in (DefaultContext, BasicContext, ExtendedContext): + context = context.copy() + _local.__decimal_context__ = context + + del threading, local # Don't contaminate the namespace ##### Decimal class ###########################################