From ce0c4aafe12ba26c4cac0400b12fe46ec5359e57 Mon Sep 17 00:00:00 2001 From: Ben Darnell Date: Sat, 27 May 2017 19:11:35 -0400 Subject: [PATCH] ioloop: Make PollIOLoop separately configurable This makes it possible to construct a PollIOLoop even when the default IOLoop is configured to something else. --- tornado/ioloop.py | 26 +++++++++++++++++--------- tornado/platform/twisted.py | 2 ++ tornado/test/twisted_test.py | 10 +++------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/tornado/ioloop.py b/tornado/ioloop.py index 5997cef66..f4d464207 100644 --- a/tornado/ioloop.py +++ b/tornado/ioloop.py @@ -249,15 +249,7 @@ class IOLoop(Configurable): @classmethod def configurable_default(cls): - if hasattr(select, "epoll"): - from tornado.platform.epoll import EPollIOLoop - return EPollIOLoop - if hasattr(select, "kqueue"): - # Python 2.6+ on BSD or Mac - from tornado.platform.kqueue import KQueueIOLoop - return KQueueIOLoop - from tornado.platform.select import SelectIOLoop - return SelectIOLoop + return PollIOLoop def initialize(self, make_current=None): if make_current is None: @@ -722,6 +714,22 @@ class PollIOLoop(IOLoop): lambda fd, events: self._waker.consume(), self.READ) + @classmethod + def configurable_base(cls): + return PollIOLoop + + @classmethod + def configurable_default(cls): + if hasattr(select, "epoll"): + from tornado.platform.epoll import EPollIOLoop + return EPollIOLoop + if hasattr(select, "kqueue"): + # Python 2.6+ on BSD or Mac + from tornado.platform.kqueue import KQueueIOLoop + return KQueueIOLoop + from tornado.platform.select import SelectIOLoop + return SelectIOLoop + def close(self, all_fds=False): self._closing = True self.remove_handler(self._waker.fileno()) diff --git a/tornado/platform/twisted.py b/tornado/platform/twisted.py index 79608e5fb..7c337e8a5 100644 --- a/tornado/platform/twisted.py +++ b/tornado/platform/twisted.py @@ -382,6 +382,8 @@ class _FD(object): self.handler(self.fileobj, tornado.ioloop.IOLoop.ERROR) self.lost = True + writeConnectionLost = readConnectionLost = connectionLost + def logPrefix(self): return '' diff --git a/tornado/test/twisted_test.py b/tornado/test/twisted_test.py index 10afebb7b..4b88eca86 100644 --- a/tornado/test/twisted_test.py +++ b/tornado/test/twisted_test.py @@ -32,9 +32,8 @@ from tornado.escape import utf8 from tornado import gen from tornado.httpclient import AsyncHTTPClient from tornado.httpserver import HTTPServer -from tornado.ioloop import IOLoop +from tornado.ioloop import IOLoop, PollIOLoop from tornado.platform.auto import set_close_exec -from tornado.platform.select import SelectIOLoop from tornado.testing import bind_unused_port from tornado.test.util import unittest from tornado.util import import_object, PY3 @@ -690,7 +689,7 @@ if have_twisted: if have_twisted: class LayeredTwistedIOLoop(TwistedIOLoop): - """Layers a TwistedIOLoop on top of a TornadoReactor on a SelectIOLoop. + """Layers a TwistedIOLoop on top of a TornadoReactor on a PollIOLoop. This is of course silly, but is useful for testing purposes to make sure we're implementing both sides of the various interfaces @@ -698,10 +697,7 @@ if have_twisted: of the whole stack. """ def initialize(self, **kwargs): - # When configured to use LayeredTwistedIOLoop we can't easily - # get the next-best IOLoop implementation, so use the lowest common - # denominator. - self.real_io_loop = SelectIOLoop(make_current=False) # type: ignore + self.real_io_loop = PollIOLoop(make_current=False) # type: ignore reactor = self.real_io_loop.run_sync(gen.coroutine(TornadoReactor)) super(LayeredTwistedIOLoop, self).initialize(reactor=reactor, **kwargs) self.add_callback(self.make_current) -- 2.47.2