[pypy-svn] r34305 - in pypy/dist/pypy: module/signal module/signal/test translator/c/src
arigo at codespeak.net
arigo at codespeak.net
Tue Nov 7 04:59:02 CET 2006
Author: arigo
Date: Tue Nov 7 04:58:52 2006
New Revision: 34305
Added:
pypy/dist/pypy/module/signal/test/__init__.py
pypy/dist/pypy/module/signal/test/test_interp_signal.py
pypy/dist/pypy/translator/c/src/signals.h
Modified:
pypy/dist/pypy/module/signal/__init__.py
pypy/dist/pypy/module/signal/interp_signal.py
pypy/dist/pypy/module/signal/test/test_signal.py
Log:
More hacking at the signal module. Should now be translatable to C.
Modified: pypy/dist/pypy/module/signal/__init__.py
==============================================================================
--- pypy/dist/pypy/module/signal/__init__.py (original)
+++ pypy/dist/pypy/module/signal/__init__.py Tue Nov 7 04:58:52 2006
@@ -4,9 +4,9 @@
class Module(MixedModule):
interpleveldefs = {
'signal': 'interp_signal.signal',
- 'NSIG': 'interp_signal.NSIG',
- 'SIG_DFL': 'interp_signal.SIG_DFL',
- 'SIG_IGN': 'interp_signal.SIG_IGN',
+ 'NSIG': 'space.wrap(interp_signal.NSIG)',
+ 'SIG_DFL': 'space.wrap(interp_signal.SIG_DFL)',
+ 'SIG_IGN': 'space.wrap(interp_signal.SIG_IGN)',
}
appleveldefs = {
Modified: pypy/dist/pypy/module/signal/interp_signal.py
==============================================================================
--- pypy/dist/pypy/module/signal/interp_signal.py (original)
+++ pypy/dist/pypy/module/signal/interp_signal.py Tue Nov 7 04:58:52 2006
@@ -123,5 +123,30 @@
cpy_signal.signal(signum, _queue_handler)
+# lltyping - direct mapping to the C functions defined in
+# translator/c/src/signals.h
+
class Entry(ExtRegistryEntry):
- pass # in-progress
+ _about_ = pypysig_poll
+ def compute_result_annotation(self):
+ from pypy.annotation import model as annmodel
+ return annmodel.SomeInteger()
+ def specialize_call(self, hop):
+ from pypy.rpython.lltypesystem import lltype
+ hop.exception_cannot_occur()
+ return hop.llops.gencapicall("pypysig_poll", [], lltype.Signed,
+ includes=('src/signals.h',))
+
+for _fn in [pypysig_default, pypysig_ignore, pypysig_setflag]:
+ class Entry(ExtRegistryEntry):
+ _about_ = _fn
+ funcname = _fn.func_name
+ def compute_result_annotation(self, s_signum):
+ return None
+ def specialize_call(self, hop):
+ from pypy.rpython.lltypesystem import lltype
+ vlist = hop.inputargs(lltype.Signed)
+ hop.exception_cannot_occur()
+ hop.llops.gencapicall(self.funcname, vlist,
+ includes=('src/signals.h',))
+del _fn
Added: pypy/dist/pypy/module/signal/test/__init__.py
==============================================================================
Added: pypy/dist/pypy/module/signal/test/test_interp_signal.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/module/signal/test/test_interp_signal.py Tue Nov 7 04:58:52 2006
@@ -0,0 +1,33 @@
+import os
+from pypy.translator.c.test.test_genc import compile
+from pypy.module.signal import interp_signal
+
+
+def check(expected):
+ res = interp_signal.pypysig_poll()
+ os.write(1, "poll() => %d, expected %d\n" % (res, expected))
+ assert res == expected
+
+def test_simple():
+ import os
+ check(-1)
+ check(-1)
+ for i in range(3):
+ interp_signal.pypysig_setflag(interp_signal.SIGUSR1)
+ os.kill(os.getpid(), interp_signal.SIGUSR1)
+ check(interp_signal.SIGUSR1)
+ check(-1)
+ check(-1)
+
+ interp_signal.pypysig_ignore(interp_signal.SIGUSR1)
+ os.kill(os.getpid(), interp_signal.SIGUSR1)
+ check(-1)
+ check(-1)
+
+ interp_signal.pypysig_default(interp_signal.SIGUSR1)
+ check(-1)
+
+
+def test_compile():
+ fn = compile(test_simple, [])
+ fn()
Modified: pypy/dist/pypy/module/signal/test/test_signal.py
==============================================================================
--- pypy/dist/pypy/module/signal/test/test_signal.py (original)
+++ pypy/dist/pypy/module/signal/test/test_signal.py Tue Nov 7 04:58:52 2006
@@ -3,10 +3,17 @@
class AppTestSignal:
def setup_class(cls):
- cls.space = gettestobjspace(usemodules=['signal'])
+ space = gettestobjspace(usemodules=['signal'])
+ cls.space = space
+ cls.w_signal = space.appexec([], "(): import signal; return signal")
+
+ def test_exported_names(self):
+ self.signal.__dict__ # crashes if the interpleveldefs are invalid
def test_usr1(self):
- import signal, types, posix
+ import types, posix
+ signal = self.signal # the signal module to test
+
received = []
def myhandler(signum, frame):
assert isinstance(frame, types.FrameType)
Added: pypy/dist/pypy/translator/c/src/signals.h
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/c/src/signals.h Tue Nov 7 04:58:52 2006
@@ -0,0 +1,94 @@
+
+/* some ifdefs from CPython's signalmodule.c... */
+
+#ifdef MS_WINDOWS
+#include <process.h>
+#endif
+
+#include <signal.h>
+
+#ifndef SIG_ERR
+#define SIG_ERR ((PyOS_sighandler_t)(-1))
+#endif
+
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)
+#define NSIG 12
+#include <process.h>
+#endif
+
+#ifndef NSIG
+# if defined(_NSIG)
+# define NSIG _NSIG /* For BSD/SysV */
+# elif defined(_SIGMAX)
+# define NSIG (_SIGMAX + 1) /* For QNX */
+# elif defined(SIGMAX)
+# define NSIG (SIGMAX + 1) /* For djgpp */
+# else
+# define NSIG 64 /* Use a reasonable default value */
+# endif
+#endif
+
+/************************************************************/
+
+/* NOTE: at the moment this file is included by a hack in
+ module/signal/interp_signal.py, only if one of the pypysig_*()
+ functions is actually used in the RPython program. */
+
+
+/* utilities to set a signal handler */
+void pypysig_ignore(int signum); /* signal will be ignored (SIG_IGN) */
+void pypysig_default(int signum); /* signal will do default action (SIG_DFL) */
+void pypysig_setflag(int signum); /* signal will set a flag which can be
+ queried with pypysig_poll() */
+
+/* utility to poll for signals that arrived */
+int pypysig_poll(void); /* => signum or -1 */
+
+/************************************************************/
+/* Implementation */
+
+#ifndef PYPY_NOT_MAIN_FILE
+
+static volatile int pypysig_occurred;
+static volatile int pypysig_flags[NSIG];
+
+void pypysig_ignore(int signum)
+{
+ signal(signum, SIG_IGN);
+}
+
+void pypysig_default(int signum)
+{
+ signal(signum, SIG_DFL);
+}
+
+static void signal_setflag_handler(int signum)
+{
+ pypysig_occurred = 1;
+ if (0 <= signum && signum < NSIG)
+ pypysig_flags[signum] = 1;
+}
+
+void pypysig_setflag(int signum)
+{
+ signal(signum, signal_setflag_handler);
+}
+
+int pypysig_poll(void)
+{
+ if (pypysig_occurred)
+ {
+ int i;
+ pypysig_occurred = 0;
+ for (i=0; i<NSIG; i++)
+ if (pypysig_flags[i])
+ {
+ pypysig_flags[i] = 0;
+ pypysig_occurred = 1; /* maybe another signal is pending */
+ return i;
+ }
+ }
+ return -1; /* no pending signal */
+}
+
+#endif
More information about the Pypy-commit
mailing list