10000 bpo-29271: Fix Task.current_task and Task.all_tasks to accept None. by 1st1 · Pull Request #406 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content
10000

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 1 commit
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
Next Next commit
bpo-29271: Fix Task.current_task and Task.all_tasks to accept None.
  • Loading branch information
1st1 committed Mar 2, 2017
commit ed0e527dbf041a025f8aaba876764948b18ea514
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.assertTrue(Task.current_task(None) is task)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use assertIs()?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch

self.assertTrue(Task.current_task() is 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 @@ -688,6 +688,9 @@ Library
- Issue #24142: Reading a corrupt config file left configparser in an
invalid state. Original patch by Florian Höch.

- Issue #29271: Fix Task.current_task and Task.all_tasks to accept
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move the entry to the start of the section. Mention that this fixes C implementation, makes it conforming to Python implementation.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aren't we usually appending news items instead of prepending?

None argument.

Windows
-------

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]*/
0