[pypy-svn] r73532 - in pypy/trunk/pypy: module/signal translator/c/src

benjamin at codespeak.net benjamin at codespeak.net
Thu Apr 8 03:35:28 CEST 2010


Author: benjamin
Date: Thu Apr  8 03:35:21 2010
New Revision: 73532

Modified:
   pypy/trunk/pypy/module/signal/interp_signal.py
   pypy/trunk/pypy/translator/c/src/signals.h
Log:
use a struct for pypysig_occurred in signals.h

This kills some strict aliasing warnings.


Modified: pypy/trunk/pypy/module/signal/interp_signal.py
==============================================================================
--- pypy/trunk/pypy/module/signal/interp_signal.py	(original)
+++ pypy/trunk/pypy/module/signal/interp_signal.py	Thu Apr  8 03:35:21 2010
@@ -39,7 +39,10 @@
 # pointless and a performance issue
 
 # don't use rffi.LONGP because the JIT doesn't support raw arrays so far
-LONG_STRUCT = lltype.Struct('LONG_STRUCT', ('value', lltype.Signed))
+struct_name = 'pypysig_long_struct'
+LONG_STRUCT = lltype.Struct(struct_name, ('c_value', lltype.Signed),
+                            hints={'c_name' : struct_name, 'external' : 'C'})
+del struct_name
 
 pypysig_getaddr_occurred = external('pypysig_getaddr_occurred', [],
                                     lltype.Ptr(LONG_STRUCT), _nowrapper=True,
@@ -51,10 +54,10 @@
 class SignalActionFlag(AbstractActionFlag):
     def get(self):
         p = pypysig_getaddr_occurred()
-        return p.value
+        return p.c_value
     def set(self, value):
         p = pypysig_getaddr_occurred()
-        p.value = value
+        p.c_value = value
 
 
 class CheckSignalAction(AsyncAction):

Modified: pypy/trunk/pypy/translator/c/src/signals.h
==============================================================================
--- pypy/trunk/pypy/translator/c/src/signals.h	(original)
+++ pypy/trunk/pypy/translator/c/src/signals.h	Thu Apr  8 03:35:21 2010
@@ -70,7 +70,11 @@
    cleared again.  The variable is exposed and RPython code is free to
    use the other bits in any way. */
 #define PENDING_SIGNAL_BIT   (LONG_MIN)   /* high bit */
-extern long pypysig_occurred;
+/* This is a struct for the JIT. See interp_signal.py. */
+struct pypysig_long_struct {
+    long value;
+};
+extern struct pypysig_long_struct pypysig_occurred;
 
 /* some C tricks to get/set the variable as efficiently as possible:
    use macros when compiling as a stand-alone program, but still
@@ -87,9 +91,8 @@
 
 #ifndef PYPY_NOT_MAIN_FILE
 
-
-long pypysig_occurred;
-static volatile long *pypysig_occurred_v = (volatile long *)&pypysig_occurred;
+struct pypysig_long_struct pypysig_occurred;
+static volatile long *pypysig_occurred_v = (volatile long *)&pypysig_occurred.value;
 static volatile int pypysig_flags[NSIG];
 
 void pypysig_ignore(int signum)
@@ -159,7 +162,7 @@
             {
                 pypysig_flags[i] = 0;
                 /* maybe another signal is pending: */
-                pypysig_occurred |= PENDING_SIGNAL_BIT;
+                pypysig_occurred.value |= PENDING_SIGNAL_BIT;
                 return i;
             }
     }



More information about the Pypy-commit mailing list