Author: Matti Picus <[email protected]>
Branch:
Changeset: r70334:7fbef7602628
Date: 2014-03-30 06:15 +0300
http://bitbucket.org/pypy/pypy/changeset/7fbef7602628/
Log: remerge branch, use select() rather than poll() for ssl on win32
diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -64,6 +64,7 @@
^pypy/goal/pypy-jvm.jar
^pypy/goal/.+\.exe$
^pypy/goal/.+\.dll$
+^pypy/goal/.+\.lib$
^pypy/_cache$
^pypy/doc/statistic/.+\.html$
^pypy/doc/statistic/.+\.eps$
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -35,7 +35,7 @@
SOCKET_HAS_TIMED_OUT, SOCKET_HAS_BEEN_CLOSED = 2, 3
SOCKET_TOO_LARGE_FOR_SELECT, SOCKET_OPERATION_OK = 4, 5
-HAVE_RPOLL = True # Even win32 has rpoll.poll
+HAVE_RPOLL = 'poll' in dir(rpoll)
constants = {}
constants["SSL_ERROR_ZERO_RETURN"] = PY_SSL_ERROR_ZERO_RETURN
diff --git a/rpython/rlib/rpoll.py b/rpython/rlib/rpoll.py
--- a/rpython/rlib/rpoll.py
+++ b/rpython/rlib/rpoll.py
@@ -141,8 +141,9 @@
# poll() for Win32
#
if hasattr(_c, 'WSAEventSelect'):
-
- def poll(fddict, timeout=-1):
+ # WSAWaitForMultipleEvents is broken. If you wish to try it,
+ # rename the function to poll() and run test_exchange in test_rpoll
+ def _poll(fddict, timeout=-1):
"""'fddict' maps file descriptors to interesting events.
'timeout' is an integer in milliseconds, and NOT a float
number of seconds, but it's the same in CPython. Use -1 for infinite.
@@ -188,6 +189,7 @@
if timeout < 0:
timeout = _c.INFINITE
+ # XXX does not correctly report write status of a port
ret = _c.WSAWaitForMultipleEvents(numevents, socketevents,
False, timeout, False)
diff --git a/rpython/rlib/test/test_rpoll.py b/rpython/rlib/test/test_rpoll.py
--- a/rpython/rlib/test/test_rpoll.py
+++ b/rpython/rlib/test/test_rpoll.py
@@ -3,12 +3,25 @@
import py
from rpython.rlib.rsocket import *
-from rpython.rlib.rpoll import *
+try:
+ from rpython.rlib.rpoll import poll
+except ImportError:
+ py.test.skip('no poll available on this platform')
from rpython.rtyper.test.test_llinterp import interpret
def setup_module(mod):
rsocket_startup()
+def one_in_event(events, fd):
+ assert len(events) == 1
+ assert events[0][0] == fd
+ assert events[0][1] & POLLIN
+
+def one_out_event(events, fd):
+ assert len(events) == 1
+ assert events[0][0] == fd
+ assert events[0][1] & POLLOUT
+
def test_simple():
serv = RSocket(AF_INET, SOCK_STREAM)
serv.bind(INETAddress('127.0.0.1', INADDR_ANY))
@@ -24,18 +37,14 @@
assert err != 0
events = poll({serv.fd: POLLIN}, timeout=500)
- assert len(events) == 1
- assert events[0][0] == serv.fd
- assert events[0][1] & POLLIN
+ one_in_event(events, serv.fd)
servconn_fd, cliaddr = serv.accept()
servconn = RSocket(AF_INET, fd=servconn_fd)
events = poll({serv.fd: POLLIN,
cli.fd: POLLOUT}, timeout=500)
- assert len(events) == 1
- assert events[0][0] == cli.fd
- assert events[0][1] & POLLOUT
+ one_out_event(events, cli.fd)
err = cli.connect_ex(servaddr)
# win32: returns WSAEISCONN when the connection finally succeed.
@@ -55,6 +64,72 @@
servconn.close()
serv.close()
+def test_exchange():
+ if not poll:
+ py.test.skip('poll not available for this platform')
+ serv = RSocket(AF_INET, SOCK_STREAM)
+ serv.bind(INETAddress('127.0.0.1', INADDR_ANY))
+ serv.listen(1)
+ servaddr = serv.getsockname()
+
+ events = poll({serv.fd: POLLIN}, timeout=100)
+ assert len(events) == 0
+
+ cli = RSocket(AF_INET, SOCK_STREAM)
+ cli.setblocking(True)
+ err = cli.connect_ex(servaddr)
+ assert err == 0
+
+ events = poll({serv.fd: POLLIN}, timeout=500)
+ one_in_event(events, serv.fd)
+
+ servconn_fd, cliaddr = serv.accept()
+ servconn = RSocket(AF_INET, fd=servconn_fd)
+
+ events = poll({serv.fd: POLLIN,
+ cli.fd: POLLOUT}, timeout=500)
+ one_out_event(events, cli.fd)
+
+ #send some data
+ events = poll({cli.fd: POLLOUT}, timeout=500)
+ one_out_event(events, cli.fd)
+ cli.send("g'day, mate")
+ events = poll({servconn.fd: POLLIN}, timeout=500)
+ one_in_event(events, servconn.fd)
+ answer = servconn.recv(1024)
+ assert answer == "g'day, mate"
+
+ #send a reply
+ events = poll({servconn.fd: POLLOUT}, timeout=500)
+ one_out_event(events, servconn.fd)
+ servconn.send("you mean hello?")
+ events = poll({cli.fd: POLLIN}, timeout=500)
+ one_in_event(events, cli.fd)
+ answer = cli.recv(1024)
+ assert answer == "you mean hello?"
+
+ #send more data
+ events = poll({cli.fd: POLLOUT}, timeout=500)
+ one_out_event(events, cli.fd)
+ cli.send("sorry, wrong channel")
+ events = poll({servconn.fd: POLLIN}, timeout=500)
+ one_in_event(events, servconn.fd)
+ answer = servconn.recv(1024)
+ assert answer == "sorry, wrong channel"
+
+ events = poll({servconn.fd: POLLOUT}, timeout=500)
+ one_out_event(events, servconn.fd)
+ servconn.send("np bye")
+ events = poll({cli.fd: POLLIN}, timeout=500)
+ one_in_event(events, cli.fd)
+ answer = cli.recv(1024)
+ assert answer == "np bye"
+
+ cli.close()
+ servconn.close()
+ serv.close()
+
+
def test_select():
if os.name == 'nt':
py.test.skip('cannot select on file handles on windows')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit