Author: Armin Rigo <ar...@tunes.org> Branch: stmgc-c7 Changeset: r75584:708ba48c7890 Date: 2015-01-30 10:33 +0100 http://bitbucket.org/pypy/pypy/changeset/708ba48c7890/
Log: Attempt to regroup the stm functions in a single built-in module called 'pypystm'. Also kill 'lib_pypy/atomic.py'. diff --git a/lib_pypy/atomic.py b/lib_pypy/atomic.py deleted file mode 100644 --- a/lib_pypy/atomic.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -API for accessing the multithreading extensions of PyPy -""" -import thread - -try: - from __pypy__ import thread as _thread - from __pypy__.thread import (atomic, getsegmentlimit, - hint_commit_soon, is_atomic) -except ImportError: - # Not a STM-enabled PyPy. We can still provide a version of 'atomic' - # that is good enough for our purposes. With this limited version, - # an atomic block in thread X will not prevent running thread Y, if - # thread Y is not within an atomic block at all. - atomic = thread.allocate_lock() - - def getsegmentlimit(): - return 1 - - def hint_commit_soon(): - pass - - def is_atomic(): - return atomic.locked() diff --git a/lib_pypy/transaction.py b/lib_pypy/transaction.py --- a/lib_pypy/transaction.py +++ b/lib_pypy/transaction.py @@ -15,7 +15,7 @@ import sys, thread, collections, cStringIO, linecache try: - from __pypy__.thread import atomic, is_atomic + from pypystm import atomic, is_atomic except ImportError: # Not a STM-enabled PyPy. We can use a regular lock for 'atomic', # which is good enough for our purposes. With this limited version, @@ -37,7 +37,7 @@ signals_enabled = _SignalsEnabled() try: - from __pypy__.thread import hint_commit_soon + from pypystm import hint_commit_soon except ImportError: # Not a STM-enabled PyPy. def hint_commit_soon(): @@ -102,7 +102,7 @@ def __init__(self): try: - from __pypy__.thread import getsegmentlimit + from pypystm import getsegmentlimit self.num_threads = getsegmentlimit() except ImportError: self.num_threads = 4 diff --git a/pypy/goal/targetpypystandalone.py b/pypy/goal/targetpypystandalone.py --- a/pypy/goal/targetpypystandalone.py +++ b/pypy/goal/targetpypystandalone.py @@ -226,9 +226,10 @@ # expose the following variables to ease debugging global space, entry_point - if config.translation.stm: + if config.translation.stm or config.objspace.usemodules.pypystm: + config.translation.stm = True config.translation.thread = True - config.objspace.usemodules._stm = True + config.objspace.usemodules.pypystm = True if config.objspace.allworkingmodules: from pypy.config.pypyoption import enable_allworkingmodules diff --git a/pypy/interpreter/executioncontext.py b/pypy/interpreter/executioncontext.py --- a/pypy/interpreter/executioncontext.py +++ b/pypy/interpreter/executioncontext.py @@ -34,7 +34,7 @@ self.w_profilefuncarg = None # if self.space.config.translation.stm: - from pypy.module._stm.ec import initialize_execution_context + from pypy.module.pypystm.ec import initialize_execution_context initialize_execution_context(self) self.thread_disappeared = False # might be set to True after os.fork() 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 @@ -29,22 +29,11 @@ class ThreadModule(MixedModule): appleveldefs = { 'signals_enabled': 'app_signal.signals_enabled', - 'atomic': 'app_atomic.atomic', - 'exclusive_atomic': 'app_atomic.exclusive_atomic', } interpleveldefs = { '_signals_enter': 'interp_signal.signals_enter', '_signals_exit': 'interp_signal.signals_exit', - '_atomic_enter': 'interp_atomic.atomic_enter', - '_exclusive_atomic_enter': 'interp_atomic.exclusive_atomic_enter', - '_atomic_exit': 'interp_atomic.atomic_exit', - 'getsegmentlimit': 'interp_atomic.getsegmentlimit', - 'hint_commit_soon': 'interp_atomic.hint_commit_soon', - 'is_atomic': 'interp_atomic.is_atomic', - 'error': 'space.fromcache(pypy.module.thread.error.Cache).w_error', } - def activate(self, space): - return self.space.config.objspace.usemodules.thread class IntOpModule(MixedModule): diff --git a/pypy/module/_stm/__init__.py b/pypy/module/pypystm/__init__.py rename from pypy/module/_stm/__init__.py rename to pypy/module/pypystm/__init__.py --- a/pypy/module/_stm/__init__.py +++ b/pypy/module/pypystm/__init__.py @@ -4,9 +4,19 @@ class Module(MixedModule): appleveldefs = { + 'atomic': 'app_atomic.atomic', + 'exclusive_atomic': 'app_atomic.exclusive_atomic', } interpleveldefs = { + '_atomic_enter': 'interp_atomic.atomic_enter', + '_exclusive_atomic_enter': 'interp_atomic.exclusive_atomic_enter', + '_atomic_exit': 'interp_atomic.atomic_exit', + 'getsegmentlimit': 'interp_atomic.getsegmentlimit', + 'hint_commit_soon': 'interp_atomic.hint_commit_soon', + 'is_atomic': 'interp_atomic.is_atomic', + 'error': 'space.fromcache(pypy.module.thread.error.Cache).w_error', + 'local': 'local.STMLocal', 'count': 'count.count', 'hashtable': 'hashtable.W_Hashtable', diff --git a/pypy/module/__pypy__/app_atomic.py b/pypy/module/pypystm/app_atomic.py rename from pypy/module/__pypy__/app_atomic.py rename to pypy/module/pypystm/app_atomic.py --- a/pypy/module/__pypy__/app_atomic.py +++ b/pypy/module/pypystm/app_atomic.py @@ -1,12 +1,12 @@ -from __pypy__ import thread +import pypystm class Atomic(object): - __enter__ = thread._atomic_enter - __exit__ = thread._atomic_exit + __enter__ = pypystm._atomic_enter + __exit__ = pypystm._atomic_exit class ExclusiveAtomic(object): - __enter__ = thread._exclusive_atomic_enter - __exit__ = thread._atomic_exit + __enter__ = pypystm._exclusive_atomic_enter + __exit__ = pypystm._atomic_exit atomic = Atomic() exclusive_atomic = ExclusiveAtomic() diff --git a/pypy/module/_stm/count.py b/pypy/module/pypystm/count.py rename from pypy/module/_stm/count.py rename to pypy/module/pypystm/count.py --- a/pypy/module/_stm/count.py +++ b/pypy/module/pypystm/count.py @@ -1,5 +1,5 @@ """ -_stm.count() +pypystm.count() """ from rpython.rlib import rstm diff --git a/pypy/module/_stm/ec.py b/pypy/module/pypystm/ec.py rename from pypy/module/_stm/ec.py rename to pypy/module/pypystm/ec.py --- a/pypy/module/_stm/ec.py +++ b/pypy/module/pypystm/ec.py @@ -20,7 +20,7 @@ """Called from ExecutionContext.__init__().""" if ec.space.config.translation.rweakref: from rpython.rlib import rweakref - from pypy.module._stm.local import STMLocal + from pypy.module.pypystm.local import STMLocal ec._thread_local_dicts = rweakref.RWeakKeyDictionary(STMLocal, W_Root) else: ec._thread_local_dicts = FakeWeakKeyDictionary() diff --git a/pypy/module/_stm/hashtable.py b/pypy/module/pypystm/hashtable.py rename from pypy/module/_stm/hashtable.py rename to pypy/module/pypystm/hashtable.py --- a/pypy/module/_stm/hashtable.py +++ b/pypy/module/pypystm/hashtable.py @@ -1,5 +1,5 @@ """ -The class _stm.hashtable, mapping integers to objects. +The class pypystm.hashtable, mapping integers to objects. """ from pypy.interpreter.baseobjspace import W_Root @@ -63,7 +63,7 @@ return space.wrap(r) W_Hashtable.typedef = TypeDef( - '_stm.hashtable', + 'pypystm.hashtable', __new__ = interp2app(W_Hashtable___new__), __getitem__ = interp2app(W_Hashtable.getitem_w), __setitem__ = interp2app(W_Hashtable.setitem_w), diff --git a/pypy/module/__pypy__/interp_atomic.py b/pypy/module/pypystm/interp_atomic.py rename from pypy/module/__pypy__/interp_atomic.py rename to pypy/module/pypystm/interp_atomic.py diff --git a/pypy/module/_stm/local.py b/pypy/module/pypystm/local.py rename from pypy/module/_stm/local.py rename to pypy/module/pypystm/local.py --- a/pypy/module/_stm/local.py +++ b/pypy/module/pypystm/local.py @@ -1,5 +1,5 @@ """ -The '_stm.local' class, used for 'thread._local' with STM. +The 'pypystm.local' class, used for 'thread._local' with STM. """ from pypy.interpreter.gateway import W_Root, interp2app @@ -10,7 +10,7 @@ def _fill_untranslated(ec): if not we_are_translated() and not hasattr(ec, '_thread_local_dicts'): - from pypy.module._stm.ec import initialize_execution_context + from pypy.module.pypystm.ec import initialize_execution_context initialize_execution_context(ec) @@ -67,7 +67,7 @@ # No arguments allowed pass -STMLocal.typedef = TypeDef("_stm.local", +STMLocal.typedef = TypeDef("pypystm.local", __doc__ = "Thread-local data", __new__ = interp2app(STMLocal.descr_local__new__.im_func), __init__ = interp2app(STMLocal.descr_local__init__), diff --git a/pypy/module/_stm/test/__init__.py b/pypy/module/pypystm/test/__init__.py rename from pypy/module/_stm/test/__init__.py rename to pypy/module/pypystm/test/__init__.py diff --git a/pypy/module/__pypy__/test/test_atomic.py b/pypy/module/pypystm/test/test_atomic.py rename from pypy/module/__pypy__/test/test_atomic.py rename to pypy/module/pypystm/test/test_atomic.py --- a/pypy/module/__pypy__/test/test_atomic.py +++ b/pypy/module/pypystm/test/test_atomic.py @@ -1,15 +1,13 @@ -from __future__ import with_statement -from pypy.module.thread.test.support import GenericTestThread -from rpython.rtyper.lltypesystem import rffi -class AppTestAtomic(GenericTestThread): +class AppTestAtomic: + spaceconfig = dict(usemodules=['pypystm', 'thread']) def test_simple(self): - from __pypy__ import thread - for atomic in thread.atomic, thread.exclusive_atomic: + import pypystm + for atomic in pypystm.atomic, pypystm.exclusive_atomic: with atomic: - assert thread.is_atomic() + assert pypystm.is_atomic() try: with atomic: raise ValueError @@ -17,40 +15,40 @@ pass def test_nest_composable_atomic(self): - from __pypy__ import thread - with thread.atomic: - with thread.atomic: - assert thread.is_atomic() - assert thread.is_atomic() - assert not thread.is_atomic() + import pypystm + with pypystm.atomic: + with pypystm.atomic: + assert pypystm.is_atomic() + assert pypystm.is_atomic() + assert not pypystm.is_atomic() def test_nest_composable_below_exclusive(self): - from __pypy__ import thread - with thread.exclusive_atomic: - with thread.atomic: - with thread.atomic: - assert thread.is_atomic() - assert thread.is_atomic() - assert thread.is_atomic() - assert not thread.is_atomic() + import pypystm + with pypystm.exclusive_atomic: + with pypystm.atomic: + with pypystm.atomic: + assert pypystm.is_atomic() + assert pypystm.is_atomic() + assert pypystm.is_atomic() + assert not pypystm.is_atomic() def test_nest_exclusive_fails(self): - from __pypy__ import thread + import pypystm try: - with thread.exclusive_atomic: - with thread.exclusive_atomic: - assert thread.is_atomic() - except thread.error, e: - assert not thread.is_atomic() + with pypystm.exclusive_atomic: + with pypystm.exclusive_atomic: + assert pypystm.is_atomic() + except pypystm.error, e: + assert not pypystm.is_atomic() assert e.message == "exclusive_atomic block can't be entered inside another atomic block" def test_nest_exclusive_fails2(self): - from __pypy__ import thread + import pypystm try: - with thread.atomic: - with thread.exclusive_atomic: - assert thread.is_atomic() - assert thread.is_atomic() - except thread.error, e: - assert not thread.is_atomic() + with pypystm.atomic: + with pypystm.exclusive_atomic: + assert pypystm.is_atomic() + assert pypystm.is_atomic() + except pypystm.error, e: + assert not pypystm.is_atomic() assert e.message == "exclusive_atomic block can't be entered inside another atomic block" diff --git a/pypy/module/_stm/test/test_count.py b/pypy/module/pypystm/test/test_count.py rename from pypy/module/_stm/test/test_count.py rename to pypy/module/pypystm/test/test_count.py --- a/pypy/module/_stm/test/test_count.py +++ b/pypy/module/pypystm/test/test_count.py @@ -1,10 +1,10 @@ class AppTestCount: - spaceconfig = dict(usemodules=['_stm']) + spaceconfig = dict(usemodules=['pypystm']) def test_count(self): - import _stm - x = _stm.count() - y = _stm.count() + import pypystm + x = pypystm.count() + y = pypystm.count() assert y == x + 1 diff --git a/pypy/module/_stm/test/test_hashtable.py b/pypy/module/pypystm/test/test_hashtable.py rename from pypy/module/_stm/test/test_hashtable.py rename to pypy/module/pypystm/test/test_hashtable.py --- a/pypy/module/_stm/test/test_hashtable.py +++ b/pypy/module/pypystm/test/test_hashtable.py @@ -1,11 +1,11 @@ class AppTestHashtable: - spaceconfig = dict(usemodules=['_stm']) + spaceconfig = dict(usemodules=['pypystm']) def test_simple(self): - import _stm - h = _stm.hashtable() + import pypystm + h = pypystm.hashtable() h[42+65536] = "bar" raises(KeyError, "h[42]") h[42] = "foo" @@ -18,8 +18,8 @@ raises(KeyError, "del h[42]") def test_get_setdefault(self): - import _stm - h = _stm.hashtable() + import pypystm + h = pypystm.hashtable() assert h.get(42) is None assert h.get(-43, None) is None assert h.get(44, 81) == 81 diff --git a/pypy/module/_stm/test/test_local.py b/pypy/module/pypystm/test/test_local.py rename from pypy/module/_stm/test/test_local.py rename to pypy/module/pypystm/test/test_local.py --- a/pypy/module/_stm/test/test_local.py +++ b/pypy/module/pypystm/test/test_local.py @@ -3,11 +3,11 @@ class AppTestSTMLocal(test_local.AppTestLocal): spaceconfig = test_local.AppTestLocal.spaceconfig.copy() - spaceconfig['usemodules'] += ('_stm',) + spaceconfig['usemodules'] += ('pypystm',) def setup_class(cls): test_local.AppTestLocal.setup_class.im_func(cls) cls.w__local = cls.space.appexec([], """(): - import _stm - return _stm.local + import pypystm + return pypystm.local """) diff --git a/pypy/module/_stm/test/test_time.py b/pypy/module/pypystm/test/test_time.py rename from pypy/module/_stm/test/test_time.py rename to pypy/module/pypystm/test/test_time.py --- a/pypy/module/_stm/test/test_time.py +++ b/pypy/module/pypystm/test/test_time.py @@ -1,13 +1,13 @@ class AppTestHashtable: - spaceconfig = dict(usemodules=['_stm']) + spaceconfig = dict(usemodules=['pypystm']) def test_simple(self): - import _stm - t1 = _stm.time() - t2 = _stm.time() + import pypystm + t1 = pypystm.time() + t2 = pypystm.time() assert t1 < t2 < t1 + 1 - t1 = _stm.clock() - t2 = _stm.clock() + t1 = pypystm.clock() + t2 = pypystm.clock() assert t1 < t2 < t1 + 1 diff --git a/pypy/module/_stm/threadlocals.py b/pypy/module/pypystm/threadlocals.py rename from pypy/module/_stm/threadlocals.py rename to pypy/module/pypystm/threadlocals.py diff --git a/pypy/module/_stm/time.py b/pypy/module/pypystm/time.py rename from pypy/module/_stm/time.py rename to pypy/module/pypystm/time.py --- a/pypy/module/_stm/time.py +++ b/pypy/module/pypystm/time.py @@ -1,5 +1,5 @@ """ -_stm.time(), _stm.clock() +pypystm.time(), pypystm.clock() """ from rpython.rtyper.lltypesystem import lltype, rffi @@ -43,7 +43,7 @@ """Similar to time.time(), but works without conflict. The drawback is that the returned times may appear out of order: this thread's transaction may commit before or after another thread's, -while _stm.time() called by both may return results in the opposite +while pypystm.time() called by both may return results in the opposite order (or even exactly equal results if you are unlucky).""" return space.wrap(pypy_clock_get_time()) @@ -51,6 +51,6 @@ """Similar to time.clock(), but works without conflict. The drawback is that the returned times may appear out of order: this thread's transaction may commit before or after another thread's, -while _stm.time() called by both may return results in the opposite +while pypystm.time() called by both may return results in the opposite order (or even exactly equal results if you are unlucky).""" return space.wrap(pypy_clock_get_clock()) diff --git a/pypy/module/thread/stm.py b/pypy/module/thread/stm.py --- a/pypy/module/thread/stm.py +++ b/pypy/module/thread/stm.py @@ -1,8 +1,8 @@ """ -Redirect some classes from pypy.module._stm. +Redirect some classes from pypy.module.pypystm. """ -from pypy.module._stm import threadlocals, local +from pypy.module.pypystm import threadlocals, local STMThreadLocals = threadlocals.STMThreadLocals STMLocal = local.STMLocal _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit