summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_asyncio/test_tasks.py17
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_asynciomodule.c12
-rw-r--r--Modules/clinic/_asynciomodule.c.h6
4 files changed, 29 insertions, 9 deletions
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index fdf91a3..754a675 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1461,6 +1461,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))
@@ -1805,8 +1813,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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 68cb711..cc896e1 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -256,6 +256,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.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index ceac7f0..2204792 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -1414,7 +1414,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.
@@ -1425,11 +1425,11 @@ 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) {
+ if (loop == Py_None) {
loop = _PyObject_CallNoArg(asyncio_get_event_loop);
if (loop == NULL) {
return NULL;
@@ -1501,7 +1501,7 @@ fail:
@classmethod
_asyncio.Task.all_tasks
- loop: 'O' = NULL
+ loop: 'O' = None
Return a set of all tasks for an event loop.
@@ -1510,11 +1510,11 @@ 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) {
+ if (loop == Py_None) {
loop = _PyObject_CallNoArg(asyncio_get_event_loop);
if (loop == NULL) {
return NULL;
diff --git a/Modules/clinic/_asynciomodule.c.h b/Modules/clinic/_asynciomodule.c.h
index f3204fb..94a6f8d 100644
--- a/Modules/clinic/_asynciomodule.c.h
+++ b/Modules/clinic/_asynciomodule.c.h
@@ -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_ParseStackAndKeywords(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_ParseStackAndKeywords(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=07a15bbb28d03edc input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3dfec49689cebd4c input=a9049054013a1b77]*/