diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-04-07 09:20:22 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-04-07 09:20:22 (GMT) |
commit | 7b2262fe78b3dff8c986d0bfe942a4defbd973f0 (patch) | |
tree | 9b74480e634bb9a172638e286cb973059a38edb5 | |
parent | 1b5643fcb47dfc471613ed37cd38556c692fe566 (diff) | |
parent | 1fd03a4a22a9419dcbad70cf32afebfe5ae390cd (diff) | |
download | cpython-7b2262fe78b3dff8c986d0bfe942a4defbd973f0.zip cpython-7b2262fe78b3dff8c986d0bfe942a4defbd973f0.tar.gz cpython-7b2262fe78b3dff8c986d0bfe942a4defbd973f0.tar.bz2 |
(Merge 3.4) Issue #21155: asyncio.EventLoop.create_unix_server() now raises a
ValueError if path and sock are specified at the same time. asyncio: Document
Task.cancel() properly.
-rw-r--r-- | Lib/asyncio/tasks.py | 19 | ||||
-rw-r--r-- | Lib/asyncio/unix_events.py | 4 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_events.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 37 insertions, 0 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 0967e7e..153f731 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -250,6 +250,25 @@ class Task(futures.Future): print(line, file=file, end='') def cancel(self): + """Request that a task to cancel itself. + + This arranges for a CancellationError to be thrown into the + wrapped coroutine on the next cycle through the event loop. + The coroutine then has a chance to clean up or even deny + the request using try/except/finally. + + Contrary to Future.cancel(), this does not guarantee that the + task will be cancelled: the exception might be caught and + acted upon, delaying cancellation of the task or preventing it + completely. The task may also return a value or raise a + different exception. + + Immediately after this method is called, Task.cancelled() will + not return True (unless the task was already cancelled). A + task will be marked as cancelled when the wrapped coroutine + terminates with a CancelledError exception (even if cancel() + was not called). + """ if self.done(): return False if self._fut_waiter is not None: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 2125548..1fbdd31 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -206,6 +206,10 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): raise TypeError('ssl argument must be an SSLContext or None') if path is not None: + if sock is not None: + raise ValueError( + 'path and sock can not be specified at the same time') + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) try: diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index bafa875..1e64dd0 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -703,6 +703,17 @@ class EventLoopTestsMixin: # close server server.close() + @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'No UNIX Sockets') + def test_create_unix_server_path_socket_error(self): + proto = MyProto(loop=self.loop) + sock = socket.socket() + with sock: + f = self.loop.create_unix_server(lambda: proto, '/test', sock=sock) + with self.assertRaisesRegex(ValueError, + 'path and sock can not be specified ' + 'at the same time'): + server = self.loop.run_until_complete(f) + def _create_ssl_context(self, certfile, keyfile=None): sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) sslcontext.options |= ssl.OP_NO_SSLv2 @@ -29,6 +29,9 @@ Core and Builtins Library ------- +- Issue #21155: asyncio.EventLoop.create_unix_server() now raises a ValueError + if path and sock are specified at the same time. + - Issue #21136: Avoid unnecessary normalization of Fractions resulting from power and other operations. Patch by Raymond Hettinger. |