[pypy-commit] pypy nogil-unsafe-2: (arigo, remi) make exception data thread-local

Raemi pypy.commits at gmail.com
Thu Mar 2 10:25:00 EST 2017


Author: Remi Meier <remi.meier at gmail.com>
Branch: nogil-unsafe-2
Changeset: r90491:e5602c37c2a3
Date: 2017-03-02 16:24 +0100
http://bitbucket.org/pypy/pypy/changeset/e5602c37c2a3/

Log:	(arigo, remi) make exception data thread-local

diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py
--- a/rpython/memory/gctypelayout.py
+++ b/rpython/memory/gctypelayout.py
@@ -432,6 +432,12 @@
                 appendto = self.addresses_of_static_ptrs
             else:
                 return
+        elif hasattr(TYPE, "_hints") and TYPE._hints.get('is_excdata'):
+            # The exception data's value object is skipped: it's a thread-
+            # local data structure. We assume that objects are stored only
+            # temporarily there, so it is always cleared at the point where we
+            # collect the roots.
+            return
         else:
             appendto = self.addresses_of_static_ptrs_in_nongc
         for a in gc_pointers_inside(value, adr, mutable_only=True):
diff --git a/rpython/translator/c/test/test_standalone.py b/rpython/translator/c/test/test_standalone.py
--- a/rpython/translator/c/test/test_standalone.py
+++ b/rpython/translator/c/test/test_standalone.py
@@ -1442,7 +1442,7 @@
         def bootstrap():
             rthread.gc_thread_start()
             x = None
-            for i in range(1000000):
+            for i in range(100000):
                 x = X(x)
 
             state.lock.acquire(True)
@@ -1458,7 +1458,7 @@
         def entry_point(argv):
             os.write(1, "hello world\n")
             # start 5 new threads
-            TS = 30
+            TS = 100
             state.lock = rthread.allocate_lock()
             state.counter = TS
 
@@ -1466,7 +1466,7 @@
                 new_thread()
 
             while True:
-                time.sleep(0.5)
+                time.sleep(0.1)
                 gc.collect()
                 if state.counter == 0:
                     break
diff --git a/rpython/translator/exceptiontransform.py b/rpython/translator/exceptiontransform.py
--- a/rpython/translator/exceptiontransform.py
+++ b/rpython/translator/exceptiontransform.py
@@ -452,7 +452,8 @@
     def setup_excdata(self):
         EXCDATA = lltype.Struct('ExcData',
             ('exc_type',  self.lltype_of_exception_type),
-            ('exc_value', self.lltype_of_exception_value))
+            ('exc_value', self.lltype_of_exception_value),
+            hints={'thread_local': True, 'is_excdata': True})
         self.EXCDATA = EXCDATA
 
         exc_data = lltype.malloc(EXCDATA, immortal=True)


More information about the pypy-commit mailing list