summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-04-07 09:20:22 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-04-07 09:20:22 (GMT)
commit7b2262fe78b3dff8c986d0bfe942a4defbd973f0 (patch)
tree9b74480e634bb9a172638e286cb973059a38edb5
parent1b5643fcb47dfc471613ed37cd38556c692fe566 (diff)
parent1fd03a4a22a9419dcbad70cf32afebfe5ae390cd (diff)
downloadcpython-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.py19
-rw-r--r--Lib/asyncio/unix_events.py4
-rw-r--r--Lib/test/test_asyncio/test_events.py11
-rw-r--r--Misc/NEWS3
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
diff --git a/Misc/NEWS b/Misc/NEWS
index 3bc36a9..a27eb51 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.