[pypy-commit] pypy default: Kill the _signalsenabled dictionary. Replace it by a value directly

arigo noreply at buildbot.pypy.org
Sat Feb 16 18:10:34 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r61326:5f7c2b2fcddd
Date: 2013-02-16 17:33 +0100
http://bitbucket.org/pypy/pypy/changeset/5f7c2b2fcddd/

Log:	Kill the _signalsenabled dictionary. Replace it by a value directly
	on the ExecutionContext. This avoids stm issues.

diff --git a/pypy/module/thread/threadlocals.py b/pypy/module/thread/threadlocals.py
--- a/pypy/module/thread/threadlocals.py
+++ b/pypy/module/thread/threadlocals.py
@@ -1,5 +1,9 @@
 from rpython.rlib import rthread
-from pypy.interpreter.error import OperationError
+from pypy.module.thread.error import wrap_thread_error
+from pypy.interpreter.executioncontext import ExecutionContext
+
+
+ExecutionContext._signals_enabled = 0     # default value
 
 
 class OSThreadLocals:
@@ -10,12 +14,10 @@
 
     def __init__(self):
         self._valuedict = {}   # {thread_ident: ExecutionContext()}
-        self._signalsenabled = {}   # {thread_ident: number-of-times}
         self._cleanup_()
 
     def _cleanup_(self):
         self._valuedict.clear()
-        self._signalsenabled.clear()
         self._mainthreadident = 0
         self._mostrecentkey = 0        # fast minicaching for the common case
         self._mostrecentvalue = None   # fast minicaching for the common case
@@ -36,7 +38,7 @@
         ident = rthread.get_ident()
         if value is not None:
             if len(self._valuedict) == 0:
-                self._signalsenabled[ident] = 1    # the main thread is enabled
+                value._signals_enabled = 1    # the main thread is enabled
                 self._mainthreadident = ident
             self._valuedict[ident] = value
         else:
@@ -44,33 +46,25 @@
                 del self._valuedict[ident]
             except KeyError:
                 pass
-            try:
-                del self._signalsenabled[ident]
-            except KeyError:
-                pass
         # update the minicache to prevent it from containing an outdated value
         self._mostrecentkey = ident
         self._mostrecentvalue = value
 
     def signals_enabled(self):
-        return rthread.get_ident() in self._signalsenabled
+        ec = self.getvalue()
+        return ec._signals_enabled
 
     def enable_signals(self, space):
-        ident = rthread.get_ident()
-        old = self._signalsenabled.get(ident, 0)
-        self._signalsenabled[ident] = old + 1
+        ec = self.getvalue()
+        ec._signals_enabled += 1
 
     def disable_signals(self, space):
-        ident = rthread.get_ident()
-        try:
-            new = self._signalsenabled[ident] - 1
-        except KeyError:
-            raise OperationError(space.w_KeyError, space.wrap(
-                "cannot disable signals in thread not enabled for signals"))
-        if new > 0:
-            self._signalsenabled[ident] = new
-        else:
-            del self._signalsenabled[ident]
+        ec = self.getvalue()
+        new = ec._signals_enabled - 1
+        if new < 0:
+            raise wrap_thread_error(space,
+                "cannot disable signals in thread not enabled for signals")
+        ec._signals_enabled = new
 
     def getallvalues(self):
         return self._valuedict
@@ -85,16 +79,10 @@
 
     def reinit_threads(self, space):
         "Called in the child process after a fork()"
-        # clear the _signalsenabled dictionary for all other threads
-        # (which are now dead); and for the current thread, force an
-        # enable_signals() if necessary.  That's a hack but I cannot
-        # figure out a non-hackish way to handle thread+signal+fork :-(
         ident = rthread.get_ident()
-        val = self.getvalue()
-        sig = self._signalsenabled.get(ident, 0)
+        ec = self.getvalue()
         if ident != self._mainthreadident:
-            sig += 1
+            ec._signals_enabled += 1
         self._cleanup_()
-        self.setvalue(val)
-        self._signalsenabled[ident] = sig
+        self.setvalue(ec)
         self._mainthreadident = ident


More information about the pypy-commit mailing list