asyncio: Add Task.current_task() class method.
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 999e962..cd9718f 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -122,6 +122,22 @@
# Weak set containing all tasks alive.
_all_tasks = weakref.WeakSet()
+ # Dictionary containing tasks that are currently active in
+ # all running event loops. {EventLoop: Task}
+ _current_tasks = {}
+
+ @classmethod
+ def current_task(cls, loop=None):
+ """Return the currently running task in an event loop or None.
+
+ By default the current task for the current event loop is returned.
+
+ None is returned when called not in the context of a Task.
+ """
+ if loop is None:
+ loop = events.get_event_loop()
+ return cls._current_tasks.get(loop)
+
@classmethod
def all_tasks(cls, loop=None):
"""Return a set of all tasks for an event loop.
@@ -252,6 +268,8 @@
self._must_cancel = False
coro = self._coro
self._fut_waiter = None
+
+ self.__class__._current_tasks[self._loop] = self
# Call either coro.throw(exc) or coro.send(value).
try:
if exc is not None:
@@ -302,6 +320,8 @@
self._step, None,
RuntimeError(
'Task got bad yield: {!r}'.format(result)))
+ finally:
+ self.__class__._current_tasks.pop(self._loop)
self = None
def _wakeup(self, future):
diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py
index c26dd88..131a546 100644
--- a/Lib/asyncio/test_utils.py
+++ b/Lib/asyncio/test_utils.py
@@ -88,7 +88,7 @@
class SSLWSGIServer(SilentWSGIServer):
def finish_request(self, request, client_address):
# The relative location of our test directory (which
- # contains the sample key and certificate files) differs
+ # contains the ssl key and certificate files) differs
# between the stdlib and stand-alone Tulip/asyncio.
# Prefer our own if we can find it.
here = os.path.join(os.path.dirname(__file__), '..', 'tests')