]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Fix typos in TwistedIOLoop that always sent both read and write events to all handlers.
authorBen Darnell <ben@bendarnell.com>
Sun, 20 Jan 2013 21:05:37 +0000 (16:05 -0500)
committerBen Darnell <ben@bendarnell.com>
Sun, 20 Jan 2013 21:06:57 +0000 (16:06 -0500)
tornado/platform/twisted.py
tornado/test/ioloop_test.py

index 3821ad01c3d854554868c335e90f279ced92639a..34e108d79866664b4f4520412266cc2d976ae121 100644 (file)
@@ -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])
index 431c3a4708e6998c80cb5cb353f58aaaf5362913..08fb1983108fdd52d6e45f21177d34272e9fa7a1 100644 (file)
@@ -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):