import asyncio import sys def _format_coroutine(coro): if asyncio.iscoroutine(coro) \ and not hasattr(coro, 'cr_code') \ and not hasattr(coro, 'gi_code'): # Most likely a Cython coroutine coro_name = '{}()'.format(coro.__qualname__ or coro.__name__) running = False try: running = coro.cr_running except AttributeError: try: running = coro.gi_running except AttributeError: pass if running: return '{} running'.format(coro_name) else: return coro_name return _old_format_coroutine(coro) async def _wait_for_data(self, func_name): """Wait until feed_data() or feed_eof() is called. If stream was paused, automatically resume it. """ if self._waiter is not None: raise RuntimeError('%s() called while another coroutine is ' 'already waiting for incoming data' % func_name) assert not self._eof, '_wait_for_data after EOF' # Waiting for data while paused will make deadlock, so prevent it. if self._paused: self._paused = False self._transport.resume_reading() try: create_future = self._loop.create_future except AttributeError: self._waiter = asyncio.Future(loop=self._loop) else: self._waiter = create_future() try: await self._waiter finally: self._waiter = None if sys.version_info < (3, 5, 3): # This is needed to support Cython 'async def' coroutines. from asyncio import coroutines _old_format_coroutine = coroutines._format_coroutine coroutines._format_coroutine = _format_coroutine if sys.version_info < (3, 5, 2): # Fix a possible deadlock, improve performance. from asyncio import streams _old_wait_for_data = streams.StreamReader._wait_for_data _wait_for_data.__module__ = _old_wait_for_data.__module__ streams.StreamReader._wait_for_data = _wait_for_data