]> granicus.if.org Git - python/commitdiff
Use threading.local() instead of threading.currentThread().
authorRaymond Hettinger <python@rcn.com>
Wed, 14 Jul 2004 21:04:27 +0000 (21:04 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 14 Jul 2004 21:04:27 +0000 (21:04 +0000)
Lib/decimal.py

index ba94d7a9ae18285fc2ec8fc8fe59162c16fe1b3c..717c6b7f3ba97aa8f2910f13dee078a62f6184a8 100644 (file)
@@ -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 ###########################################