[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