Author: Armin Rigo <[email protected]>
Branch: stmgc-c7
Changeset: r70223:4eb53be43a92
Date: 2014-03-24 07:29 +0100
http://bitbucket.org/pypy/pypy/changeset/4eb53be43a92/
Log: Add __pypy__.thread.getsegmentlimit()
diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -34,6 +34,15 @@
------------------------------------------------------------
+__pypy__.thread.getsegmentlimit():
+
+XXX This limit is so far a compile time option (STM_NB_SEGMENTS in
+rpython/translator/stm/src_stm/stmgc.h), but this should instead be
+based on the machine found at run-time. We should also be able to
+change the limit (or at least lower it) with setsegmentlimit().
+
+------------------------------------------------------------
+
diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py
--- a/pypy/module/__pypy__/__init__.py
+++ b/pypy/module/__pypy__/__init__.py
@@ -41,6 +41,7 @@
'_atomic_exit': 'interp_atomic.atomic_exit',
'last_abort_info': 'interp_atomic.last_abort_info',
'discard_last_abort_info': 'interp_atomic.discard_last_abort_info',
+ 'getsegmentlimit': 'interp_atomic.getsegmentlimit',
}
diff --git a/pypy/module/__pypy__/interp_atomic.py
b/pypy/module/__pypy__/interp_atomic.py
--- a/pypy/module/__pypy__/interp_atomic.py
+++ b/pypy/module/__pypy__/interp_atomic.py
@@ -41,6 +41,24 @@
raise wrap_thread_error(space,
"atomic.__exit__(): more exits than enters")
+def getsegmentlimit(space):
+ '''Return the number of "segments" this PyPy is running with.
+
+With STM, multithreaded Python code executes on multiple segments in
+parallel. This function gives the limit above which more threads will not
+be able to execute on more cores. In a non-STM PyPy, this limit is 1.
+
+XXX This limit is so far a compile time option (STM_NB_SEGMENTS in
+rpython/translator/stm/src_stm/stmgc.h), but this should instead be
+based on the machine found at run-time. We should also be able to
+change the limit (or at least lower it) with setsegmentlimit().
+'''
+ if space.config.translation.stm:
+ from rpython.rlib.rstm import stm_nb_segments
+ return space.wrap(stm_nb_segments)
+ else:
+ return space.wrap(1)
+
def last_abort_info(space):
from rpython.rlib.rstm import charp_inspect_abort_info
p = charp_inspect_abort_info()
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -8,6 +8,7 @@
TID = rffi.UINT
tid_offset = CDefinedIntSymbolic('offsetof(struct rpyobj_s, tid)')
+stm_nb_segments = CDefinedIntSymbolic('STM_NB_SEGMENTS')
adr_nursery_free = CDefinedIntSymbolic('((long)&STM_SEGMENT->nursery_current)')
adr_nursery_top = CDefinedIntSymbolic('((long)&STM_SEGMENT->nursery_end)')
adr_transaction_read_version = (
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit