Skip to content

bpo-29271: Fix Task.current_task and Task.all_tasks to accept None. #406

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 3, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Lib/test/test_asyncio/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -1461,6 +1461,14 @@ def test_current_task(self):
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))
Expand Down Expand Up @@ -1805,8 +1813,17 @@ def kill_me(loop):
# 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)
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
12 changes: 6 additions & 6 deletions Modules/_asynciomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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;
Expand Down Expand Up @@ -1501,7 +1501,7 @@ task_all_tasks(PyObject *loop)
@classmethod
_asyncio.Task.all_tasks

loop: 'O' = NULL
loop: 'O' = None

Return a set of all tasks for an event loop.

Expand All @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions Modules/clinic/_asynciomodule.c.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)) {
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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]*/