[Python-checkins] cpython (merge 3.4 -> default): (Merge 3.4) Issue #21155: asyncio.EventLoop.create_unix_server() now raises a

victor.stinner python-checkins at python.org
Mon Apr 7 11:22:32 CEST 2014


http://hg.python.org/cpython/rev/34ace7eb67e9
changeset:   90165:34ace7eb67e9
parent:      90162:b466fd273625
parent:      90164:a6b764848b20
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Apr 07 11:20:22 2014 +0200
summary:
  (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.

files:
  Lib/asyncio/tasks.py                 |  19 ++++++++++++++++
  Lib/asyncio/unix_events.py           |   4 +++
  Lib/test/test_asyncio/test_events.py |  11 +++++++++
  Misc/NEWS                            |   3 ++
  4 files changed, 37 insertions(+), 0 deletions(-)


diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -250,6 +250,25 @@
                 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
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -206,6 +206,10 @@
             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
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -703,6 +703,17 @@
         # 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
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -29,6 +29,9 @@
 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.
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list