From: Ben Darnell Date: Sun, 20 Jan 2013 21:05:37 +0000 (-0500) Subject: Fix typos in TwistedIOLoop that always sent both read and write events to all handlers. X-Git-Tag: v3.0.0~162 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=553145c75505ce299479ff69d8a7d58744450dcc;p=thirdparty%2Ftornado.git Fix typos in TwistedIOLoop that always sent both read and write events to all handlers. --- diff --git a/tornado/platform/twisted.py b/tornado/platform/twisted.py index 3821ad01c..34e108d79 100644 --- a/tornado/platform/twisted.py +++ b/tornado/platform/twisted.py @@ -405,15 +405,15 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): if fd in self.fds: raise ValueError('fd %d added twice' % fd) self.fds[fd] = _FD(fd, wrap(handler)) - if events | tornado.ioloop.IOLoop.READ: + if events & tornado.ioloop.IOLoop.READ: self.fds[fd].reading = True self.reactor.addReader(self.fds[fd]) - if events | tornado.ioloop.IOLoop.WRITE: + if events & tornado.ioloop.IOLoop.WRITE: self.fds[fd].writing = True self.reactor.addWriter(self.fds[fd]) def update_handler(self, fd, events): - if events | tornado.ioloop.IOLoop.READ: + if events & tornado.ioloop.IOLoop.READ: if not self.fds[fd].reading: self.fds[fd].reading = True self.reactor.addReader(self.fds[fd]) @@ -421,7 +421,7 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): if self.fds[fd].reading: self.fds[fd].reading = False self.reactor.removeReader(self.fds[fd]) - if events | tornado.ioloop.IOLoop.WRITE: + if events & tornado.ioloop.IOLoop.WRITE: if not self.fds[fd].writing: self.fds[fd].writing = True self.reactor.addWriter(self.fds[fd]) diff --git a/tornado/test/ioloop_test.py b/tornado/test/ioloop_test.py index 431c3a470..08fb19831 100644 --- a/tornado/test/ioloop_test.py +++ b/tornado/test/ioloop_test.py @@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function, with_statement import contextlib import datetime import functools +import socket import sys import threading import time @@ -12,7 +13,7 @@ import time from tornado.ioloop import IOLoop from tornado.stack_context import ExceptionStackContext, StackContext, wrap, NullContext from tornado.testing import AsyncTestCase, bind_unused_port -from tornado.test.util import unittest +from tornado.test.util import unittest, skipIfNonUnix try: from concurrent import futures @@ -128,6 +129,25 @@ class TestIOLoop(AsyncTestCase): self.io_loop.add_callback(lambda: 1 / 0) self.wait() + @skipIfNonUnix # just because socketpair is so convenient + def test_read_while_writeable(self): + # Ensure that write events don't come in while we're waiting for + # a read and haven't asked for writeability. (the reverse is + # difficult to test for) + client, server = socket.socketpair() + try: + def handler(fd, events): + self.assertEqual(events, IOLoop.READ) + self.stop() + self.io_loop.add_handler(client.fileno(), handler, IOLoop.READ) + self.io_loop.add_timeout(self.io_loop.time() + 0.01, + functools.partial(server.send, b'asdf')) + self.wait() + self.io_loop.remove_handler(client.fileno()) + finally: + client.close() + server.close() + class TestIOLoopAddCallback(AsyncTestCase): def setUp(self):