Author: Armin Rigo <ar...@tunes.org> Branch: stm-thread-2 Changeset: r61318:1bf6c8d6fe7b Date: 2013-02-16 11:35 +0100 http://bitbucket.org/pypy/pypy/changeset/1bf6c8d6fe7b/
Log: Untested so far: attempt to fix signals for stm diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py --- a/pypy/module/signal/__init__.py +++ b/pypy/module/signal/__init__.py @@ -47,5 +47,10 @@ space.check_signal_action = interp_signal.CheckSignalAction(space) space.actionflag.register_periodic_action(space.check_signal_action, use_bytecode_counter=False) - space.actionflag.__class__ = interp_signal.SignalActionFlag + # + if space.config.translation.stm: + from pypy.module.signal.stmactionflag import SignalActionFlag + else: + from pypy.module.signal.actionflag import SignalActionFlag + space.actionflag.__class__ = SignalActionFlag # xxx yes I know the previous line is a hack diff --git a/pypy/module/signal/actionflag.py b/pypy/module/signal/actionflag.py new file mode 100644 --- /dev/null +++ b/pypy/module/signal/actionflag.py @@ -0,0 +1,33 @@ +from pypy.interpreter.executioncontext import AbstractActionFlag +from rpython.rlib import jit +from rpython.rlib.rsignal import pypysig_getaddr_occurred + + +class SignalActionFlag(AbstractActionFlag): + # This class uses the C-level pypysig_counter variable as the tick + # counter. The C-level signal handler will reset it to -1 whenever + # a signal is received. This causes CheckSignalAction.perform() to + # be called. + + def get_ticker(self): + p = pypysig_getaddr_occurred() + return p.c_value + + def reset_ticker(self, value): + p = pypysig_getaddr_occurred() + p.c_value = value + + def rearm_ticker(self): + p = pypysig_getaddr_occurred() + p.c_value = -1 + + def decrement_ticker(self, by): + p = pypysig_getaddr_occurred() + value = p.c_value + if self.has_bytecode_counter: # this 'if' is constant-folded + if jit.isconstant(by) and by == 0: + pass # normally constant-folded too + else: + value -= by + p.c_value = value + return value diff --git a/pypy/module/signal/interp_signal.py b/pypy/module/signal/interp_signal.py --- a/pypy/module/signal/interp_signal.py +++ b/pypy/module/signal/interp_signal.py @@ -4,8 +4,7 @@ import sys from pypy.interpreter.error import OperationError, exception_from_errno -from pypy.interpreter.executioncontext import (AsyncAction, AbstractActionFlag, - PeriodicAsyncAction) +from pypy.interpreter.executioncontext import AsyncAction, PeriodicAsyncAction from pypy.interpreter.gateway import unwrap_spec from rpython.rlib import jit, rposix, rgc @@ -18,36 +17,6 @@ WIN32 = sys.platform == 'win32' -class SignalActionFlag(AbstractActionFlag): - # This class uses the C-level pypysig_counter variable as the tick - # counter. The C-level signal handler will reset it to -1 whenever - # a signal is received. This causes CheckSignalAction.perform() to - # be called. - - def get_ticker(self): - p = pypysig_getaddr_occurred() - return p.c_value - - def reset_ticker(self, value): - p = pypysig_getaddr_occurred() - p.c_value = value - - def rearm_ticker(self): - p = pypysig_getaddr_occurred() - p.c_value = -1 - - def decrement_ticker(self, by): - p = pypysig_getaddr_occurred() - value = p.c_value - if self.has_bytecode_counter: # this 'if' is constant-folded - if jit.isconstant(by) and by == 0: - pass # normally constant-folded too - else: - value -= by - p.c_value = value - return value - - class CheckSignalAction(PeriodicAsyncAction): """An action that is automatically invoked when a signal is received.""" diff --git a/pypy/module/signal/stmactionflag.py b/pypy/module/signal/stmactionflag.py new file mode 100644 --- /dev/null +++ b/pypy/module/signal/stmactionflag.py @@ -0,0 +1,28 @@ +from pypy.interpreter.executioncontext import AbstractActionFlag +from rpython.rlib import jit +from rpython.rlib.rsignal import pypysig_get_occurred, pypysig_set_occurred + + +class SignalActionFlag(AbstractActionFlag): + # This is mostly a copy of actionflag.py, but written in a way + # that doesn't force atomic transactions --- but isn't very JIT + # friendly yet. + + def get_ticker(self): + return pypysig_get_occurred() + + def reset_ticker(self, value): + pypysig_set_occurred(value) + + def rearm_ticker(self): + pypysig_set_occurred(-1) + + def decrement_ticker(self, by): + value = pypysig_get_occurred() + if self.has_bytecode_counter: # this 'if' is constant-folded + if jit.isconstant(by) and by == 0: + pass # normally constant-folded too + else: + value -= by + pypysig_set_occurred(value) + return value diff --git a/rpython/rlib/rsignal.py b/rpython/rlib/rsignal.py --- a/rpython/rlib/rsignal.py +++ b/rpython/rlib/rsignal.py @@ -45,7 +45,8 @@ 'pypysig_ignore', 'pypysig_setflag', 'pypysig_reinstall', 'pypysig_set_wakeup_fd', - 'pypysig_getaddr_occurred'], + 'pypysig_getaddr_occurred', + 'pypysig_get_occurred', 'pypysig_set_occurred'], ) class CConfig: @@ -93,6 +94,12 @@ lltype.Ptr(LONG_STRUCT), _nowrapper=True, transactionsafe=True, elidable_function=True) +pypysig_get_occurred = external('pypysig_get_occurred', [], lltype.Signed, + _nowrapper=True, + transactionsafe=True) +pypysig_set_occurred = external('pypysig_set_occurred', [lltype.Signed], + lltype.Void, _nowrapper=True, + transactionsafe=True) c_alarm = external('alarm', [rffi.INT], rffi.INT) c_pause = external('pause', [], rffi.INT, threadsafe=True) c_siginterrupt = external('siginterrupt', [rffi.INT, rffi.INT], rffi.INT) diff --git a/rpython/translator/c/src/signals.h b/rpython/translator/c/src/signals.h --- a/rpython/translator/c/src/signals.h +++ b/rpython/translator/c/src/signals.h @@ -26,4 +26,7 @@ void *pypysig_getaddr_occurred(void); #define pypysig_getaddr_occurred() ((void *)(&pypysig_counter)) +static long pypysig_get_occurred(void) { return pypysig_counter.value; } +static void pypysig_set_occurred(long value) { pypysig_counter.value = value; } + #endif _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit