mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	bpo-29271: Fix Task.current_task and Task.all_tasks to accept None. (#406)
This commit is contained in:
		
							parent
							
								
									ba7e1f9a4e
								
							
						
					
					
						commit
						8d26aa930c
					
				
					 4 changed files with 29 additions and 9 deletions
				
			
		|  | @ -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)) | ||||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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. | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 @@ 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. | ||||
| 
 | ||||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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]*/ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yury Selivanov
						Yury Selivanov