[pypy-svn] r46761 - in pypy/dist/pypy/rlib: . test

arigo at codespeak.net arigo at codespeak.net
Thu Sep 20 14:57:40 CEST 2007


Author: arigo
Date: Thu Sep 20 14:57:40 2007
New Revision: 46761

Modified:
   pypy/dist/pypy/rlib/_rsocket_rffi.py
   pypy/dist/pypy/rlib/rsocket_rffi.py
   pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
Log:
Some more operations.


Modified: pypy/dist/pypy/rlib/_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/_rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/_rsocket_rffi.py	Thu Sep 20 14:57:40 2007
@@ -3,6 +3,7 @@
 from pypy.rpython.lltypesystem import lltype
 from pypy.rpython.tool import rffi_platform as platform
 from pypy.rpython.lltypesystem.rffi import CCHARP
+from pypy.rpython.lltypesystem.rffi import get_errno as geterrno
 
 from pypy.rlib.rarithmetic import intmask, r_uint
 import os
@@ -379,7 +380,6 @@
 external = rffi.llexternal
 
 if _POSIX:
-    strerror = external('strerror', [rffi.INT], CCHARP)
     gai_strerror = external('gai_strerror', [rffi.INT], CCHARP)
 
 #h_errno = c_int.in_dll(socketdll, 'h_errno')
@@ -421,10 +421,11 @@
                                               socklen_t], CCHARP)
 
 inet_addr = external('inet_addr', [rffi.CCHARP], rffi.UINT)
-socklen_t_ptr = rffi.CArray(socklen_t)
+socklen_t_ptr = lltype.Ptr(rffi.CFixedArray(socklen_t, 1))
 socketaccept = external('accept', [socketfd_type, sockaddr_ptr,
                               socklen_t_ptr], rffi.INT)
-bind = external('bind', [rffi.INT, socketfd_type, socklen_t], rffi.INT)
+socketbind = external('bind', [socketfd_type, sockaddr_ptr, socklen_t],
+                              rffi.INT)
 socketlisten = external('listen', [socketfd_type, rffi.INT], rffi.INT)
 socketgetpeername = external('getpeername', [socketfd_type,
                                     sockaddr_ptr, socklen_t_ptr], rffi.INT)
@@ -582,5 +583,4 @@
     def socket_strerror(errno):
         return WIN32_ERROR_MESSAGES.get(errno, "winsock error %d" % errno)
 else:
-    def socket_strerror(errno):
-        return strerror(errno)
+    socket_strerror = os.strerror

Modified: pypy/dist/pypy/rlib/rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/rsocket_rffi.py	Thu Sep 20 14:57:40 2007
@@ -456,12 +456,10 @@
 
 def make_null_address(family):
     klass = familyclass(family)
-    buf = create_string_buffer(klass.maxlen)
     result = instantiate(klass)
-    XXX; result._addr_keepalive2 = buf
-    result.addr = cast(buf, _c.sockaddr_ptr).contents
-    result.addrlen = 0
-    return result, len(buf)
+    buf = mallocbuf(klass.maxlen)
+    result.setdata(buf, 0)
+    return result, klass.maxlen
 
 def ipaddr_from_object(space, w_sockaddr):
     host = space.str_w(space.getitem(w_sockaddr, space.wrap(0)))
@@ -562,7 +560,9 @@
 
     def _addrbuf(self):
         addr, maxlen = make_null_address(self.family)
-        return addr, _c.socklen_t(maxlen)
+        addrlen_p = lltype.malloc(_c.socklen_t_ptr.TO, flavor='raw')
+        addrlen_p[0] = rffi.cast(_c.socklen_t, maxlen)
+        return addr, addrlen_p
 
     def accept(self, SocketClass=None):
         """Wait for an incoming connection.
@@ -571,18 +571,22 @@
             SocketClass = RSocket
         if self._select(False) == 1:
             raise SocketTimeout
-        address, addrlen = self._addrbuf()
-        newfd = _c.socketaccept(self.fd, byref(address.addr), byref(addrlen))
+        address, addrlen_p = self._addrbuf()
+        try:
+            newfd = _c.socketaccept(self.fd, address.addr, addrlen_p)
+            addrlen = addrlen_p[0]
+        finally:
+            lltype.free(addrlen_p, flavor='raw')
         if _c.invalid_socket(newfd):
             raise self.error_handler()
-        address.addrlen = addrlen.value
+        address.addrlen = addrlen
         sock = make_socket(newfd, self.family, self.type, self.proto,
                            SocketClass)
         return (sock, address)
 
     def bind(self, address):
         """Bind the socket to a local address."""
-        res = _c.socketbind(self.fd, byref(address.addr), address.addrlen)
+        res = _c.socketbind(self.fd, address.addr, address.addrlen)
         if res < 0:
             raise self.error_handler()
 
@@ -597,13 +601,13 @@
 
     def connect(self, address):
         """Connect the socket to a remote address."""
-        res = _c.socketconnect(self.fd, byref(address.addr), address.addrlen)
+        res = _c.socketconnect(self.fd, address.addr, address.addrlen)
         if self.timeout > 0.0:
             errno = _c.geterrno()
             if res < 0 and errno == _c.EINPROGRESS:
                 timeout = self._select(True)
                 if timeout == 0:
-                    res = _c.socketconnect(self.fd, byref(address.addr),
+                    res = _c.socketconnect(self.fd, address.addr,
                                            address.addrlen)
                 elif timeout == -1:
                     raise self.error_handler()
@@ -616,13 +620,13 @@
     def connect_ex(self, address):
         """This is like connect(address), but returns an error code (the errno
         value) instead of raising an exception when an error occurs."""
-        res = _c.socketconnect(self.fd, byref(address.addr), address.addrlen)
+        res = _c.socketconnect(self.fd, address.addr, address.addrlen)
         if self.timeout > 0.0:
             errno = _c.geterrno()
             if res < 0 and errno == _c.EINPROGRESS:
                 timeout = self._select(True)
                 if timeout == 0:
-                    res = _c.socketconnect(self.fd, byref(address.addr),
+                    res = _c.socketconnect(self.fd, address.addr,
                                            address.addrlen)
                 elif timeout == -1:
                     return _c.geterrno()
@@ -651,22 +655,28 @@
 
     def getpeername(self):
         """Return the address of the remote endpoint."""
-        address, addrlen = self._addrbuf()
-        res = _c.socketgetpeername(self.fd, byref(address.addr),
-                                            byref(addrlen))
+        address, addrlen_p = self._addrbuf()
+        try:
+            res = _c.socketgetpeername(self.fd, address.addr, addrlen_p)
+            addrlen = addrlen_p[0]
+        finally:
+            lltype.free(addrlen_p, flavor='raw')
         if res < 0:
             raise self.error_handler()
-        address.addrlen = addrlen.value
+        address.addrlen = addrlen
         return address
 
     def getsockname(self):
         """Return the address of the local endpoint."""
-        address, addrlen = self._addrbuf()
-        res = _c.socketgetsockname(self.fd, byref(address.addr),
-                                            byref(addrlen))
+        address, addrlen_p = self._addrbuf()
+        try:
+            res = _c.socketgetsockname(self.fd, address.addr, addrlen_p)
+            addrlen = addrlen_p[0]
+        finally:
+            lltype.free(addrlen_p, flavor='raw')
         if res < 0:
             raise self.error_handler()
-        address.addrlen = addrlen.value
+        address.addrlen = addrlen
         return address
 
     def getsockopt(self, level, option, maxlen):
@@ -733,18 +743,25 @@
         if timeout == 1:
             raise SocketTimeout
         elif timeout == 0:
-            buf = create_string_buffer(buffersize)
-            address, addrlen = self._addrbuf()
-            read_bytes = _c.recvfrom(self.fd, buf, buffersize, flags,
-                                     byref(address.addr), byref(addrlen))
-        if read_bytes < 0:
-            raise self.error_handler()
-        result_addrlen = addrlen.value
-        if result_addrlen:
-            address.addrlen = result_addrlen
-        else:
-            address = None
-        return (buf[:read_bytes], address)
+            buf = mallocbuf(buffersize)
+            try:
+                address, addrlen_p = self._addrbuf()
+                try:
+                    read_bytes = _c.recvfrom(self.fd, buf, buffersize, flags,
+                                             address.addr, addrlen_p)
+                    addrlen = addrlen_p[0]
+                finally:
+                    lltype.free(addrlen_p, flavor='raw')
+                if read_bytes >= 0:
+                    if addrlen:
+                        address.addrlen = addrlen
+                    else:
+                        address = None
+                    data = ''.join([buf[i] for i in range(read_bytes)])
+                    return (data, address)
+            finally:
+                lltype.free(buf, flavor='raw')
+        raise self.error_handler()
 
     def send(self, data, flags=0):
         """Send a data string to the socket.  For the optional flags

Modified: pypy/dist/pypy/rlib/test/test_rsocket_rffi.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rsocket_rffi.py	(original)
+++ pypy/dist/pypy/rlib/test/test_rsocket_rffi.py	Thu Sep 20 14:57:40 2007
@@ -58,7 +58,6 @@
     s2.close()
 
 def test_simple_tcp():
-    py.test.skip("in-progress")
     import thread
     sock = RSocket()
     try_ports = [1023] + range(20000, 30000, 437)
@@ -78,21 +77,27 @@
     sock.listen(1)
     s2 = RSocket(AF_INET, SOCK_STREAM)
     thread.start_new_thread(s2.connect, (addr,))
+    print 'waiting for connexion'
     s1, addr2 = sock.accept()
+    print 'connexion accepted'
     assert addr.eq(s2.getpeername())
     assert addr2.eq(s2.getsockname())
     assert addr2.eq(s1.getpeername())
 
     s1.send('?')
+    print 'sent one character'
     buf = s2.recv(100)
     assert buf == '?'
-    thread.start_new_thread(s2.sendall, ('x'*500000,))
+    print 'received ok'
+    thread.start_new_thread(s2.sendall, ('x'*50000,))
     buf = ''
-    while len(buf) < 500000:
-        data = s1.recv(500100)
+    while len(buf) < 50000:
+        data = s1.recv(50100)
+        print 'recv returned %d bytes' % (len(data,))
         assert data
         buf += data
-    assert buf == 'x'*500000
+    assert buf == 'x'*50000
+    print 'data received ok'
     s1.close()
     s2.close()
 



More information about the Pypy-commit mailing list