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])
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])
import contextlib
import datetime
import functools
+import socket
import sys
import threading
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
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):