[pypy-commit] pypy nogil-unsafe-2: move nogil test to own file
Raemi
pypy.commits at gmail.com
Mon Mar 20 09:37:06 EDT 2017
Author: Remi Meier <remi.meier at gmail.com>
Branch: nogil-unsafe-2
Changeset: r90760:2edf4f9d6779
Date: 2017-03-20 14:36 +0100
http://bitbucket.org/pypy/pypy/changeset/2edf4f9d6779/
Log: move nogil test to own file
diff --git a/rpython/translator/c/test/test_nogil.py b/rpython/translator/c/test/test_nogil.py
new file mode 100644
--- /dev/null
+++ b/rpython/translator/c/test/test_nogil.py
@@ -0,0 +1,98 @@
+import py
+import os
+
+from rpython.translator.translator import TranslationContext
+from rpython.translator.c.genc import CStandaloneBuilder
+
+from rpython.annotator.listdef import s_list_of_strings
+
+
+
+
+
+
+
+class TestThread(object):
+ gcrootfinder = 'shadowstack'
+ config = None
+
+ def compile(self, entry_point, no__thread=False):
+ t = TranslationContext(self.config)
+ t.config.translation.gc = "incminimark"
+ 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()
+ #
+ cbuilder = CStandaloneBuilder(t, entry_point, t.config)
+ cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES)
+ cbuilder.compile()
+ #
+ return t, cbuilder
+
+
+
+ def test_concurrent_allocate(self):
+ import time
+ from rpython.rlib import rthread, rposix
+
+ class X:
+ def __init__(self, prev, i):
+ self.prev = prev
+ self.i = i
+
+ class State:
+ pass
+ state = State()
+
+ def thread():
+ rthread.gc_thread_start()
+ x = None
+ for i in range(100000000):
+ prev_x = x
+
+ x = X(x, i)
+
+ if prev_x is not None:
+ assert prev_x.i == i - 1
+
+ if i % 5001 == 0:
+ x = None
+
+ state.lock.acquire(True)
+ os.write(1, "counter=%d\n" % state.counter)
+ state.counter -= 1
+ state.lock.release()
+ rthread.gc_thread_die()
+
+ def entry_point(argv):
+ os.write(1, "hello world\n")
+ # start 5 new threads
+ TS = int(argv[1])
+ state.lock = rthread.allocate_lock()
+ state.counter = TS
+
+ for _ in range(TS):
+ rthread.start_new_thread(thread, ())
+
+ i = 0
+ while True:
+ x = X(None, i)
+ time.sleep(0.1)
+ assert x.i == i
+ if state.counter == 0:
+ break
+ i += 1
+ os.write(1, "all threads done\n")
+ return 0
+
+ t, cbuilder = self.compile(entry_point)
+ data = cbuilder.cmdexec('5')
+ assert data.splitlines() == ['hello world',
+ 'counter=5',
+ 'counter=4',
+ 'counter=3',
+ 'counter=2',
+ 'counter=1',
+ 'all threads done']
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
@@ -1427,79 +1427,6 @@
and result.count('a') == 1
and result.count('d') == 6)
- def test_thread_and_gc_nogil(self):
- import time, gc
- from rpython.rlib import rthread, rposix
-
- class X:
- def __init__(self, prev, i):
- self.prev = prev
- self.i = i
-
- class State:
- pass
- state = State()
-
- def bootstrap():
- rthread.gc_thread_start()
- x = None
- for i in range(100000000):
- prev_x = x
-
- x = X(x, i)
-
- if prev_x is not None:
- assert prev_x.i == i - 1
-
- if i % 5001 == 0:
- x = None
-
- state.lock.acquire(True)
- os.write(1, "counter=%d\n" % state.counter)
- state.counter -= 1
- state.lock.release()
- rthread.gc_thread_die()
-
- def new_thread():
- ident = rthread.start_new_thread(bootstrap, ())
- return ident
-
- def entry_point(argv):
- os.write(1, "hello world\n")
- # start 5 new threads
- TS = int(argv[1])
- state.lock = rthread.allocate_lock()
- state.counter = TS
-
- for _ in range(TS):
- new_thread()
-
- i = 0
- while True:
- x = X(None, i)
- time.sleep(0.1)
- assert x.i == i
- #gc.collect()
- if state.counter == 0:
- break
- i += 1
- os.write(1, "all threads done\n")
- return 0
-
- def runme(no__thread):
- t, cbuilder = self.compile(entry_point, no__thread=no__thread)
- data = cbuilder.cmdexec('5')
- assert data.splitlines() == ['hello world',
- 'counter=5',
- 'counter=4',
- 'counter=3',
- 'counter=2',
- 'counter=1',
- 'all threads done']
-
- if SUPPORT__THREAD:
- runme(no__thread=False)
- #runme(no__thread=True)
class TestShared(StandaloneTests):
More information about the pypy-commit
mailing list