]> granicus.if.org Git - python/commitdiff
bpo-29271: Fix Task.current_task and Task.all_tasks to accept None. (#406)
authorYury Selivanov <yselivanov@gmail.com>
Fri, 3 Mar 2017 03:16:33 +0000 (22:16 -0500)
committerYury Selivanov <yury@magic.io>
Fri, 3 Mar 2017 04:19:49 +0000 (23:19 -0500)
Lib/test/test_asyncio/test_tasks.py
Misc/NEWS
Modules/_asynciomodule.c
Modules/clinic/_asynciomodule.c.h

index a18d49ae3741128fe1a8cf4bcbd39cb75f3fb5e4..4f05319457985ad91aeb4b5b49d76764a6886c70 100644 (file)
@@ -1462,6 +1462,14 @@ class BaseTaskTests:
         def coro(loop):
             self.assertTrue(Task.current_task(loop=loop) is task)
 
+            # See http://bugs.python.org/issue29271 for details:
+            asyncio.set_event_loop(loop)
+            try:
+                self.assertIs(Task.current_task(None), task)
+                self.assertIs(Task.current_task(), task)
+            finally:
+                asyncio.set_event_loop(None)
+
         task = self.new_task(self.loop, coro(self.loop))
         self.loop.run_until_complete(task)
         self.assertIsNone(Task.current_task(loop=self.loop))
@@ -1806,8 +1814,17 @@ class BaseTaskTests:
         # schedule the task
         coro = kill_me(self.loop)
         task = asyncio.ensure_future(coro, loop=self.loop)
+
         self.assertEqual(Task.all_tasks(loop=self.loop), {task})
 
+        # See http://bugs.python.org/issue29271 for details:
+        asyncio.set_event_loop(self.loop)
+        try:
+            self.assertEqual(Task.all_tasks(), {task})
+            self.assertEqual(Task.all_tasks(None), {task})
+        finally:
+            asyncio.set_event_loop(None)
+
         # execute the task so it waits for future
         self.loop._run_once()
         self.assertEqual(len(self.loop._ready), 0)
index 7e355e1b91c0419bfae47540eeacba2d3283b815..ab5c602c454e93bf779452fdaa22cd39910cb718 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -82,6 +82,9 @@ Extension Modules
 Library
 -------
 
+- bpo-29271: Fix Task.current_task and Task.all_tasks implemented in C
+  to accept None argument as their pure Python implementation.
+
 - bpo-29703: Fix asyncio to support instantiation of new event loops
   in child processes.
 
index fff90468a5927c1d367a05124451df4d54ca934e..d0e43ae47d9ec824b0ff0f0186ea2a4c636f5a30 100644 (file)
@@ -1413,7 +1413,7 @@ TaskObj_get_fut_waiter(TaskObj *task)
 @classmethod
 _asyncio.Task.current_task
 
-    loop: 'O' = NULL
+    loop: 'O' = None
 
 Return the currently running task in an event loop or None.
 
@@ -1424,12 +1424,12 @@ None is returned when called not in the context of a Task.
 
 static PyObject *
 _asyncio_Task_current_task_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=99fbe7332c516e03 input=cd784537f02cf833]*/
+/*[clinic end generated code: output=99fbe7332c516e03 input=a0d6cdf2e3b243e1]*/
 {
     PyObject *res;
 
-    if (loop == NULL) {
-        loop = PyObject_CallObject(asyncio_get_event_loop, NULL);
+    if (loop == Py_None) {
+        loop = _PyObject_CallNoArg(asyncio_get_event_loop);
         if (loop == NULL) {
             return NULL;
         }
@@ -1500,7 +1500,7 @@ fail:
 @classmethod
 _asyncio.Task.all_tasks
 
-    loop: 'O' = NULL
+    loop: 'O' = None
 
 Return a set of all tasks for an event loop.
 
@@ -1509,12 +1509,12 @@ By default all tasks for the current event loop are returned.
 
 static PyObject *
 _asyncio_Task_all_tasks_impl(PyTypeObject *type, PyObject *loop)
-/*[clinic end generated code: output=11f9b20749ccca5d input=cd64aa5f88bd5c49]*/
+/*[clinic end generated code: output=11f9b20749ccca5d input=c6f5b53bd487488f]*/
 {
     PyObject *res;
 
-    if (loop == NULL) {
-        loop = PyObject_CallObject(asyncio_get_event_loop, NULL);
+    if (loop == Py_None) {
+        loop = _PyObject_CallNoArg(asyncio_get_event_loop);
         if (loop == NULL) {
             return NULL;
         }
index 052d252331f6a7a2c5e0acb11efe9fa49e882766..41f11f4cac5494c1730c54abb64ce52b99c5a066 100644 (file)
@@ -278,7 +278,7 @@ _asyncio_Task_current_task(PyTypeObject *type, PyObject **args, Py_ssize_t nargs
     PyObject *return_value = NULL;
     static const char * const _keywords[] = {"loop", NULL};
     static _PyArg_Parser _parser = {"|O:current_task", _keywords, 0};
-    PyObject *loop = NULL;
+    PyObject *loop = Py_None;
 
     if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser,
         &loop)) {
@@ -310,7 +310,7 @@ _asyncio_Task_all_tasks(PyTypeObject *type, PyObject **args, Py_ssize_t nargs, P
     PyObject *return_value = NULL;
     static const char * const _keywords[] = {"loop", NULL};
     static _PyArg_Parser _parser = {"|O:all_tasks", _keywords, 0};
-    PyObject *loop = NULL;
+    PyObject *loop = Py_None;
 
     if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser,
         &loop)) {
@@ -517,4 +517,4 @@ _asyncio_Task__wakeup(TaskObj *self, PyObject **args, Py_ssize_t nargs, PyObject
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=8f036321bb083066 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=40ca6c9da517da73 input=a9049054013a1b77]*/