[pypy-commit] pypy default: Reduce differences in rsocket.py between default and py3k:
amauryfa
noreply at buildbot.pypy.org
Tue Sep 25 01:21:41 CEST 2012
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch:
Changeset: r57541:968e401d5ff6
Date: 2012-09-25 01:21 +0200
http://bitbucket.org/pypy/pypy/changeset/968e401d5ff6/
Log: Reduce differences in rsocket.py between default and py3k:
RSocket.accept only returns the file descriptor, the client is
responsible for creating the new socket object.
diff --git a/pypy/module/_socket/interp_socket.py b/pypy/module/_socket/interp_socket.py
--- a/pypy/module/_socket/interp_socket.py
+++ b/pypy/module/_socket/interp_socket.py
@@ -29,7 +29,9 @@
info is a pair (hostaddr, port).
"""
try:
- sock, addr = self.accept(W_RSocket)
+ fd, addr = self.accept()
+ sock = rsocket.make_socket(
+ fd, self.family, self.type, self.proto, W_RSocket)
return space.newtuple([space.wrap(sock),
addr.as_object(sock.fd, space)])
except SocketError, e:
diff --git a/pypy/rlib/rsocket.py b/pypy/rlib/rsocket.py
--- a/pypy/rlib/rsocket.py
+++ b/pypy/rlib/rsocket.py
@@ -609,9 +609,11 @@
"""
_mixin_ = True # for interp_socket.py
fd = _c.INVALID_SOCKET
- def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0):
+ def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0,
+ fd=_c.INVALID_SOCKET):
"""Create a new socket."""
- fd = _c.socket(family, type, proto)
+ if _c.invalid_socket(fd):
+ fd = _c.socket(family, type, proto)
if _c.invalid_socket(fd):
raise self.error_handler()
# PLAT RISCOS
@@ -717,11 +719,9 @@
addrlen_p[0] = rffi.cast(_c.socklen_t, maxlen)
return addr, addr.addr_p, addrlen_p
- def accept(self, SocketClass=None):
+ def accept(self):
"""Wait for an incoming connection.
- Return (new socket object, client address)."""
- if SocketClass is None:
- SocketClass = RSocket
+ Return (new socket fd, client address)."""
if self._select(False) == 1:
raise SocketTimeout
address, addr_p, addrlen_p = self._addrbuf()
@@ -734,9 +734,7 @@
if _c.invalid_socket(newfd):
raise self.error_handler()
address.addrlen = rffi.cast(lltype.Signed, addrlen)
- sock = make_socket(newfd, self.family, self.type, self.proto,
- SocketClass)
- return (sock, address)
+ return (newfd, address)
def bind(self, address):
"""Bind the socket to a local address."""
@@ -755,6 +753,11 @@
if res != 0:
raise self.error_handler()
+ def detach(self):
+ fd = self.fd
+ self.fd = _c.INVALID_SOCKET
+ return fd
+
if _c.WIN32:
def _connect(self, address):
"""Connect the socket to a remote address."""
diff --git a/pypy/rlib/test/test_rsocket.py b/pypy/rlib/test/test_rsocket.py
--- a/pypy/rlib/test/test_rsocket.py
+++ b/pypy/rlib/test/test_rsocket.py
@@ -167,7 +167,8 @@
lock.acquire()
thread.start_new_thread(connecting, ())
print 'waiting for connection'
- s1, addr2 = sock.accept()
+ fd1, addr2 = sock.accept()
+ s1 = RSocket(fd=fd1)
print 'connection accepted'
lock.acquire()
print 'connecting side knows that the connection was accepted too'
@@ -255,7 +256,8 @@
if errcodesok:
assert err.value.errno in (errno.EINPROGRESS, errno.EWOULDBLOCK)
- s1, addr2 = sock.accept()
+ fd1, addr2 = sock.accept()
+ s1 = RSocket(fd=fd1)
s1.setblocking(False)
assert addr.eq(s2.getpeername())
assert addr2.get_port() == s2.getsockname().get_port()
@@ -414,7 +416,8 @@
clientsock = RSocket(AF_UNIX)
clientsock.connect(a)
- s, addr = serversock.accept()
+ fd, addr = serversock.accept()
+ s = RSocket(AF_UNIX, fd=fd)
s.send('X')
data = clientsock.recv(100)
More information about the pypy-commit
mailing list