]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Merge remote-tracking branch 'origin/master' into mypy
authorBen Darnell <ben@bendarnell.com>
Sun, 7 Oct 2018 04:26:16 +0000 (00:26 -0400)
committerBen Darnell <ben@bendarnell.com>
Sun, 7 Oct 2018 04:26:16 +0000 (00:26 -0400)
1  2 
tornado/platform/asyncio.py
tornado/test/httpclient_test.py
tornado/web.py

index aa701d6b32ab9219bbff60008cb340a3b4dd6654,0ee5afe588b839919f31c45af19bde8f3a2f0805..0b79f82ca8ff6e3b75a8b85fa08b09695647a8b5
@@@ -62,9 -61,17 +63,17 @@@ class BaseAsyncIOLoop(IOLoop)
              if loop.is_closed():
                  del IOLoop._ioloop_for_asyncio[loop]
          IOLoop._ioloop_for_asyncio[asyncio_loop] = self
+         self._thread_identity = 0
          super(BaseAsyncIOLoop, self).initialize(**kwargs)
  
 -    def close(self, all_fds: bool=False) -> None:
+         def assign_thread_identity() -> None:
+             self._thread_identity = get_ident()
+         self.add_callback(assign_thread_identity)
 +    def close(self, all_fds: bool = False) -> None:
          self.closing = True
          for fd in list(self.handlers):
              fileobj, handler_func = self.handlers[fd]
          timeout.cancel()  # type: ignore
  
      def add_callback(self, callback: Callable, *args: Any, **kwargs: Any) -> None:
+         if get_ident() == self._thread_identity:
+             call_soon = self.asyncio_loop.call_soon
+         else:
+             call_soon = self.asyncio_loop.call_soon_threadsafe
          try:
-             self.asyncio_loop.call_soon_threadsafe(
-                 self._run_callback, functools.partial(callback, *args, **kwargs)
-             )
 -            call_soon(
 -                self._run_callback,
 -                functools.partial(callback, *args, **kwargs))
++            call_soon(self._run_callback, functools.partial(callback, *args, **kwargs))
          except RuntimeError:
              # "Event loop is closed". Swallow the exception for
              # consistency with PollIOLoop (and logical consistency
              # eventually execute).
              pass
  
-     add_callback_from_signal = add_callback
 -    def add_callback_from_signal(self, callback: Callable, *args: Any, **kwargs: Any) -> None:
++    def add_callback_from_signal(
++        self, callback: Callable, *args: Any, **kwargs: Any
++    ) -> None:
+         try:
+             self.asyncio_loop.call_soon_threadsafe(
 -                self._run_callback,
 -                functools.partial(callback, *args, **kwargs))
++                self._run_callback, functools.partial(callback, *args, **kwargs)
++            )
+         except RuntimeError:
+             pass
  
 -    def run_in_executor(self, executor: Optional[concurrent.futures.Executor],
 -                        func: Callable[..., _T], *args: Any) -> Awaitable[_T]:
 +    def run_in_executor(
 +        self,
 +        executor: Optional[concurrent.futures.Executor],
 +        func: Callable[..., _T],
 +        *args: Any
 +    ) -> Awaitable[_T]:
          return self.asyncio_loop.run_in_executor(executor, func, *args)
  
      def set_default_executor(self, executor: concurrent.futures.Executor) -> None:
index d0b46ebece00a0d08e719076a0f4e96bde4d1e4e,d11ceff863e67ea24d72db02de3ee14fd0fea261..c30c1b56617b2ec13114fe892cc5c055e1dbaa2a
@@@ -609,14 -552,18 +610,18 @@@ class SyncHTTPClientTest(unittest.TestC
          @gen.coroutine
          def init_server():
              sock, self.port = bind_unused_port()
 -            app = Application([('/', HelloWorldHandler)])
 +            app = Application([("/", HelloWorldHandler)])
              self.server = HTTPServer(app)
              self.server.add_socket(sock)
+             event.set()
  
-         self.server_ioloop.run_sync(init_server)
+         def start():
+             self.server_ioloop.run_sync(init_server)
+             self.server_ioloop.start()
  
-         self.server_thread = threading.Thread(target=self.server_ioloop.start)
+         self.server_thread = threading.Thread(target=start)
          self.server_thread.start()
+         event.wait()
  
          self.http_client = HTTPClient()
  
diff --cc tornado/web.py
index bbc977d7df7018010430d7a4b7b6e47243f54409,76337ea8317d9a0cb4fb54187fbb34382c2d6ede..9742b88a6e520ed3b6dd803b2d2c77787e494f7c
@@@ -2554,15 -2328,12 +2554,13 @@@ class StaticFileHandler(RequestHandler)
      .. versionchanged:: 3.1
         Many of the methods for subclasses were added in Tornado 3.1.
      """
 +
      CACHE_MAX_AGE = 86400 * 365 * 10  # 10 years
  
 -    _static_hashes = {}  # type: typing.Dict
 +    _static_hashes = {}  # type: Dict[str, Optional[str]]
      _lock = threading.Lock()  # protects _static_hashes
  
-     def initialize(
-         self, path: str, default_filename: str = None
-     ) -> None:
 -    def initialize(self, path, default_filename=None):
++    def initialize(self, path: str, default_filename: str = None) -> None:
          self.root = path
          self.default_filename = default_filename