Author: Armin Rigo <ar...@tunes.org>
Branch: portable-threadlocal
Changeset: r74736:31fa1fdc28a7
Date: 2014-11-26 15:44 +0100
http://bitbucket.org/pypy/pypy/changeset/31fa1fdc28a7/

Log:    test and fix for the no-__thread case

diff --git a/rpython/translator/c/src/threadlocal.c 
b/rpython/translator/c/src/threadlocal.c
--- a/rpython/translator/c/src/threadlocal.c
+++ b/rpython/translator/c/src/threadlocal.c
@@ -69,6 +69,9 @@
    explicitly, with malloc()/free(), and attached to (a single) thread-
    local key using the API of Windows or pthread. */
 
+pthread_key_t pypy_threadlocal_key;
+
+
 void RPython_ThreadLocals_ProgramInit(void)
 {
 #ifdef _WIN32
diff --git a/rpython/translator/c/src/threadlocal.h 
b/rpython/translator/c/src/threadlocal.h
--- a/rpython/translator/c/src/threadlocal.h
+++ b/rpython/translator/c/src/threadlocal.h
@@ -55,15 +55,16 @@
 #ifdef _WIN32
 #  include <WinSock2.h>
 #  include <windows.h>
-#  define _RPy_ThreadLocals_Get  TlsGetValue
-#  define _RPy_ThreadLocals_Set  TlsSetValue
-RPY_EXTERN DWORD pypy_threadlocal_key;
+#  define _RPy_ThreadLocals_Get()   TlsGetValue(pypy_threadlocal_key)
+#  define _RPy_ThreadLocals_Set(x)  TlsSetValue(pypy_threadlocal_key, x)
+typedef DWORD pthread_key_t;
 #else
 #  include <pthread.h>
-#  define _RPy_ThreadLocals_Get  pthread_getspecific
-#  define _RPy_ThreadLocals_Set  pthread_setspecific
+#  define _RPy_ThreadLocals_Get()   pthread_getspecific(pypy_threadlocal_key)
+#  define _RPy_ThreadLocals_Set(x)  pthread_setspecific(pypy_threadlocal_key, 
x)
+#endif
+
 RPY_EXTERN pthread_key_t pypy_threadlocal_key;
-#endif
 
 
 #define OP_THREADLOCALREF_ADDR(r)               \
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
@@ -2,6 +2,7 @@
 import sys, os, re
 
 from rpython.config.translationoption import get_combined_translation_config
+from rpython.config.translationoption import SUPPORT__THREAD
 from rpython.rlib.objectmodel import keepalive_until_here
 from rpython.rlib.rarithmetic import r_longlong
 from rpython.rlib.debug import ll_assert, have_debug_prints, debug_flush
@@ -1026,11 +1027,12 @@
     gcrootfinder = 'shadowstack'
     config = None
 
-    def compile(self, entry_point):
+    def compile(self, entry_point, no__thread=True):
         t = TranslationContext(self.config)
         t.config.translation.gc = "semispace"
         t.config.translation.gcrootfinder = self.gcrootfinder
         t.config.translation.thread = True
+        t.config.translation.no__thread = no__thread
         t.buildannotator().build_types(entry_point, [s_list_of_strings])
         t.buildrtyper().specialize()
         #
@@ -1142,7 +1144,7 @@
 
     def test_thread_and_gc(self):
         import time, gc
-        from rpython.rlib import rthread
+        from rpython.rlib import rthread, rposix
         from rpython.rtyper.lltypesystem import lltype
         from rpython.rlib.objectmodel import invoke_around_extcall
 
@@ -1163,14 +1165,22 @@
                 self.head = head
                 self.tail = tail
 
+        def check_errno(value):
+            rposix.set_errno(value)
+            for i in range(10000000):
+                pass
+            assert rposix.get_errno() == value
+
         def bootstrap():
             rthread.gc_thread_start()
+            check_errno(42)
             state.xlist.append(Cons(123, Cons(456, None)))
             gc.collect()
             rthread.gc_thread_die()
 
         def new_thread():
             ident = rthread.start_new_thread(bootstrap, ())
+            check_errno(41)
             time.sleep(0.5)    # enough time to start, hopefully
             return ident
 
@@ -1209,14 +1219,19 @@
                 os.write(1, "%d ok\n" % (i+1))
             return 0
 
-        t, cbuilder = self.compile(entry_point)
-        data = cbuilder.cmdexec('')
-        assert data.splitlines() == ['hello world',
-                                     '1 ok',
-                                     '2 ok',
-                                     '3 ok',
-                                     '4 ok',
-                                     '5 ok']
+        def runme(no__thread):
+            t, cbuilder = self.compile(entry_point, no__thread=no__thread)
+            data = cbuilder.cmdexec('')
+            assert data.splitlines() == ['hello world',
+                                         '1 ok',
+                                         '2 ok',
+                                         '3 ok',
+                                         '4 ok',
+                                         '5 ok']
+
+        if SUPPORT__THREAD:
+            runme(no__thread=False)
+        runme(no__thread=True)
 
 
     def test_gc_with_fork_without_threads(self):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to