summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-07-02 22:59:28 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-07-02 22:59:28 (GMT)
commitb57d6a2fec3b0f2bb508ae3f3dcb9d6b54056fda (patch)
tree5a1fa1c25781204440052afc9c0ec979dc76ee76
parent6680e9f5fd1015ec7630c7658b5fdcce93114ab4 (diff)
parent2dba23af7145f3edc608dc16209e6ead38c0f6c8 (diff)
downloadcpython-b57d6a2fec3b0f2bb508ae3f3dcb9d6b54056fda.zip
cpython-b57d6a2fec3b0f2bb508ae3f3dcb9d6b54056fda.tar.gz
cpython-b57d6a2fec3b0f2bb508ae3f3dcb9d6b54056fda.tar.bz2
(Merge 3.4) asyncio: sync with Tulip
* _UnixSubprocessTransport: fix file mode of stdin. Open stdin in write mode, not in read mode * Examples: close the event loop at exit * More reliable CoroWrapper.__del__. If the constructor is interrupted by KeyboardInterrupt or the coroutine objet is destroyed lately, some the _source_traceback attribute doesn't exist anymore. * repr(Task): include also the future the task is waiting for
-rw-r--r--Lib/asyncio/coroutines.py14
-rw-r--r--Lib/asyncio/tasks.py3
-rw-r--r--Lib/asyncio/unix_events.py2
-rw-r--r--Lib/test/test_asyncio/test_tasks.py11
4 files changed, 23 insertions, 7 deletions
diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py
index cdb1ea8..71a1ec4 100644
--- a/Lib/asyncio/coroutines.py
+++ b/Lib/asyncio/coroutines.py
@@ -111,12 +111,14 @@ class CoroWrapper:
frame = getattr(gen, 'gi_frame', None)
if frame is not None and frame.f_lasti == -1:
func = events._format_callback(self.func, ())
- tb = ''.join(traceback.format_list(self._source_traceback))
- message = ('Coroutine %s was never yielded from\n'
- 'Coroutine object created at (most recent call last):\n'
- '%s'
- % (func, tb.rstrip()))
- logger.error(message)
+ msg = 'Coroutine %s was never yielded from' % func
+ tb = getattr(self, '_source_traceback', ())
+ if tb:
+ tb = ''.join(traceback.format_list(tb))
+ msg += ('\nCoroutine object created at '
+ '(most recent call last):\n')
+ msg += tb.rstrip()
+ logger.error(msg)
def coroutine(func):
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index e9adf1d..dd191e7 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -109,6 +109,9 @@ class Task(futures.Future):
if self._callbacks:
info.append(self._format_callbacks())
+ if self._fut_waiter is not None:
+ info.append('wait_for=%r' % self._fut_waiter)
+
return '<%s %s>' % (self.__class__.__name__, ' '.join(info))
def get_stack(self, *, limit=None):
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index 1cb70ff..5f728b5 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -494,7 +494,7 @@ class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport):
universal_newlines=False, bufsize=bufsize, **kwargs)
if stdin_w is not None:
stdin.close()
- self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize)
+ self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize)
class AbstractChildWatcher:
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index c64e1ef..83b7e61 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -218,6 +218,17 @@ class TaskTests(test_utils.TestCase):
'<Task pending %s cb=[<Dummy>()]>' % coro)
self.loop.run_until_complete(t)
+ def test_task_repr_wait_for(self):
+ @asyncio.coroutine
+ def wait_for(fut):
+ return (yield from fut)
+
+ fut = asyncio.Future(loop=self.loop)
+ task = asyncio.Task(wait_for(fut), loop=self.loop)
+ test_utils.run_briefly(self.loop)
+ self.assertRegex(repr(task),
+ '<Task .* wait_for=%s>' % re.escape(repr(fut)))
+
def test_task_basics(self):
@asyncio.coroutine
def outer():