[pypy-svn] r56186 - pypy/dist/pypy/rlib

afa at codespeak.net afa at codespeak.net
Mon Jun 30 19:33:59 CEST 2008


Author: afa
Date: Mon Jun 30 19:33:57 2008
New Revision: 56186

Modified:
   pypy/dist/pypy/rlib/_rsocket_rffi.py
   pypy/dist/pypy/rlib/rsocket.py
Log:
win32 now uses the same select() implementation as posix platforms.
This should correct the translation of the socket module on windows.


Modified: pypy/dist/pypy/rlib/_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/_rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/_rsocket_rffi.py	Mon Jun 30 19:33:57 2008
@@ -53,8 +53,7 @@
     COND_HEADER = ''
 constants = {}
 
-if _POSIX:
-    sources = ["""
+sources = ["""
     void pypy_macro_wrapper_FD_SET(int fd, fd_set *set)
     {
         FD_SET(fd, set);
@@ -73,13 +72,16 @@
     }
     """]
 
-else:
-    sources = []
 eci = ExternalCompilationInfo(
     post_include_bits = [HEADER, COND_HEADER],
     includes = includes,
     libraries = libraries,
     separate_module_sources = sources,
+    export_symbols = ['pypy_macro_wrapper_FD_ZERO',
+                      'pypy_macro_wrapper_FD_SET',
+                      'pypy_macro_wrapper_FD_CLR',
+                      'pypy_macro_wrapper_FD_ISSET',
+                      ],
 )
 
 class CConfig:
@@ -304,13 +306,7 @@
                                          [('tv_sec', rffi.LONG),
                                           ('tv_usec', rffi.LONG)])
 
-if _MS_WINDOWS:
-    CConfig.fd_set = platform.Struct('struct fd_set',
-                                     [('fd_count', rffi.UINT),
-                                      # XXX use FD_SETSIZE
-                                      ('fd_array', rffi.CFixedArray(socketfd_type, 64))])
-else:
-    fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci)
+fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci)
 
 if _MS_WINDOWS:
     CConfig.WSAData = platform.Struct('struct WSAData',
@@ -400,8 +396,6 @@
     WSAEVENT = cConfig.WSAEVENT
     WSANETWORKEVENTS = cConfig.WSANETWORKEVENTS
 timeval = cConfig.timeval
-if _MS_WINDOWS:
-    fd_set = cConfig.fd_set
 
 #if _POSIX:
 #    includes = list(includes)
@@ -415,6 +409,10 @@
     return rffi.llexternal(name, args, result, compilation_info=eci,
                            calling_conv=calling_conv)
 
+def external_c(name, args, result):
+    return rffi.llexternal(name, args, result, compilation_info=eci,
+                           calling_conv='c')
+
 if _POSIX:
     dup = external('dup', [socketfd_type], socketfd_type)
     gai_strerror = external('gai_strerror', [rffi.INT], CCHARP)
@@ -503,25 +501,22 @@
                            [socketfd_type, rffi.LONG, rffi.ULONGP],
                            rffi.INT)
 
+select = external('select',
+                  [rffi.INT, fd_set, fd_set,
+                   fd_set, lltype.Ptr(timeval)],
+                  rffi.INT)
+
+FD_CLR = external_c('pypy_macro_wrapper_FD_CLR', [rffi.INT, fd_set], lltype.Void)
+FD_ISSET = external_c('pypy_macro_wrapper_FD_ISSET', [rffi.INT, fd_set], rffi.INT)
+FD_SET = external_c('pypy_macro_wrapper_FD_SET', [rffi.INT, fd_set], lltype.Void)
+FD_ZERO = external_c('pypy_macro_wrapper_FD_ZERO', [fd_set], lltype.Void)
+
 if _POSIX:
     pollfdarray = rffi.CArray(pollfd)
     poll = external('poll', [lltype.Ptr(pollfdarray), nfds_t, rffi.INT],
                     rffi.INT)
-    select = external('select',
-                      [rffi.INT, fd_set, fd_set,
-                       fd_set, lltype.Ptr(timeval)],
-                      rffi.INT)
-    
-    FD_CLR = external('pypy_macro_wrapper_FD_CLR', [rffi.INT, fd_set], lltype.Void)
-    FD_ISSET = external('pypy_macro_wrapper_FD_ISSET', [rffi.INT, fd_set], rffi.INT)
-    FD_SET = external('pypy_macro_wrapper_FD_SET', [rffi.INT, fd_set], lltype.Void)
-    FD_ZERO = external('pypy_macro_wrapper_FD_ZERO', [fd_set], lltype.Void)
     
 elif MS_WINDOWS:
-    select = external('select',
-                      [rffi.INT, lltype.Ptr(fd_set), lltype.Ptr(fd_set),
-                       lltype.Ptr(fd_set), lltype.Ptr(timeval)],
-                      rffi.INT)
     #
     # The following is for pypy.rlib.rpoll
     #

Modified: pypy/dist/pypy/rlib/rsocket.py
==============================================================================
--- pypy/dist/pypy/rlib/rsocket.py	(original)
+++ pypy/dist/pypy/rlib/rsocket.py	Mon Jun 30 19:33:57 2008
@@ -587,10 +587,10 @@
             rffi.setintfield(tv, 'c_tv_sec', int(timeout))
             rffi.setintfield(tv, 'c_tv_usec', int((timeout-int(timeout))
                                                   * 1000000))
-            fds = rffi.make(_c.fd_set)
-            rffi.setintfield(fds, 'c_fd_count', 1)
-            fds.c_fd_array[0] = rffi.cast(_c.socketfd_type, self.fd)
-            null = lltype.nullptr(_c.fd_set)
+            fds = rffi.malloc(_c.fd_set.TO, flavor='raw')
+            _c.FD_ZERO(fds)
+            _c.FD_SET(self.fd, fds)
+            null = lltype.nullptr(_c.fd_set.TO)
             if for_writing:
                 n = _c.select(self.fd + 1, null, fds, null, tv)
             else:



More information about the Pypy-commit mailing list