]> granicus.if.org Git - python/commitdiff
Issue #23347, asyncio: send_signal(), terminate(), kill() don't check if the
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 30 Jan 2015 00:20:44 +0000 (01:20 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 30 Jan 2015 00:20:44 +0000 (01:20 +0100)
transport was closed. The check broken a Tulip example and this limitation is
arbitrary. Check if _proc is None should be enough.

Enhance also close(): do nothing when called the second time.

Lib/asyncio/base_subprocess.py
Lib/test/test_asyncio/test_subprocess.py

index 70676ab3ff56c55ec86054049bf44313d786091b..02b9e89f70915aba4e76e65563313c01ad22ef05 100644 (file)
@@ -84,6 +84,8 @@ class BaseSubprocessTransport(transports.SubprocessTransport):
         raise NotImplementedError
 
     def close(self):
+        if self._closed:
+            return
         self._closed = True
 
         for proto in self._pipes.values():
@@ -100,8 +102,7 @@ class BaseSubprocessTransport(transports.SubprocessTransport):
             except ProcessLookupError:
                 pass
 
-            # Don't clear the _proc reference yet because _post_init() may
-            # still run
+            # Don't clear the _proc reference yet: _post_init() may still run
 
     # On Python 3.3 and older, objects with a destructor part of a reference
     # cycle are never destroyed. It's not more the case on Python 3.4 thanks
@@ -125,8 +126,6 @@ class BaseSubprocessTransport(transports.SubprocessTransport):
             return None
 
     def _check_proc(self):
-        if self._closed:
-            raise ValueError("operation on closed transport")
         if self._proc is None:
             raise ProcessLookupError()
 
index d4b71b7a5a28d9afa1f4039fbfa305923f1ddc48..b467b04f535aa2ec6235b75012facfb6e4961bb7 100644 (file)
@@ -47,22 +47,6 @@ class SubprocessTransportTests(test_utils.TestCase):
                         None, None, None, 0, waiter=waiter)
         return (transport, protocol)
 
-    def test_close(self):
-        waiter = asyncio.Future(loop=self.loop)
-        transport, protocol = self.create_transport(waiter)
-        transport._process_exited(0)
-        transport.close()
-
-        # The loop didn't run yet
-        self.assertFalse(protocol.connection_made.called)
-
-        # methods must raise ProcessLookupError if the transport was closed
-        self.assertRaises(ValueError, transport.send_signal, signal.SIGTERM)
-        self.assertRaises(ValueError, transport.terminate)
-        self.assertRaises(ValueError, transport.kill)
-
-        self.loop.run_until_complete(waiter)
-
     def test_proc_exited(self):
         waiter = asyncio.Future(loop=self.loop)
         transport, protocol = self.create_transport(waiter)