Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions asyncio/base_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ def __repr__(self):
def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs):
raise NotImplementedError

def is_closing(self):
return self._closed

def close(self):
if self._closed:
return
Expand Down
3 changes: 3 additions & 0 deletions asyncio/proactor_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ def __repr__(self):
def _set_extra(self, sock):
self._extra['pipe'] = sock

def is_closing(self):
return self._closing

def close(self):
if self._closing:
return
Expand Down
3 changes: 3 additions & 0 deletions asyncio/selector_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,9 @@ def __repr__(self):
def abort(self):
self._force_close(None)

def is_closing(self):
return self._closing

def close(self):
if self._closing:
return
Expand Down
3 changes: 3 additions & 0 deletions asyncio/sslproto.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,9 @@ def get_extra_info(self, name, default=None):
"""Get optional transport information."""
return self._ssl_protocol._get_extra_info(name, default)

def is_closing(self):
return self._closed

def close(self):
"""Close the transport.

Expand Down
2 changes: 1 addition & 1 deletion asyncio/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ def drain(self):
if exc is not None:
raise exc
if self._transport is not None:
if self._transport._closing:
if self._transport.is_closing():
# Yield to the event loop so connection_lost() may be
# called. Without this, _drain_helper() would return
# immediately, and code that calls
Expand Down
4 changes: 4 additions & 0 deletions asyncio/transports.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ def get_extra_info(self, name, default=None):
"""Get optional transport information."""
return self._extra.get(name, default)

def is_closing(self):
"""Return True if the transport is closing or closed."""
raise NotImplementedError

def close(self):
"""Close the transport.

Expand Down
6 changes: 6 additions & 0 deletions asyncio/unix_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,9 @@ def pause_reading(self):
def resume_reading(self):
self._loop.add_reader(self._fileno, self._read_ready)

def is_closing(self):
return self._closing

def close(self):
if not self._closing:
self._close(None)
Expand Down Expand Up @@ -548,6 +551,9 @@ def write_eof(self):
self._loop.remove_reader(self._fileno)
self._loop.call_soon(self._call_connection_lost, None)

def is_closing(self):
return self._closing

def close(self):
if self._pipe is not None and not self._closing:
# write_eof is all what we needed to close the write pipe
Expand Down
6 changes: 3 additions & 3 deletions tests/test_proactor_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ def test_close(self):
tr.close()
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(None)
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertEqual(tr._conn_lost, 1)

self.protocol.connection_lost.reset_mock()
Expand Down Expand Up @@ -298,7 +298,7 @@ def test_write_eof_write_pipe(self):
self.loop, self.sock, self.protocol)
self.assertTrue(tr.can_write_eof())
tr.write_eof()
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.loop._run_once()
self.assertTrue(self.sock.close.called)
tr.close()
Expand All @@ -309,7 +309,7 @@ def test_write_eof_buffer_write_pipe(self):
tr._loop._proactor.send.return_value = f
tr.write(b'data')
tr.write_eof()
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertFalse(self.sock.shutdown.called)
tr._loop._proactor.send.assert_called_with(self.sock, b'data')
f.set_result(4)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_selector_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,7 +698,7 @@ def test_close(self):
tr = self.create_transport()
tr.close()

self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertEqual(1, self.loop.remove_reader_count[7])
self.protocol.connection_lost(None)
self.assertEqual(tr._conn_lost, 1)
Expand All @@ -723,7 +723,7 @@ def test_force_close(self):
self.loop.add_writer(7, mock.sentinel)
tr._force_close(None)

self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertEqual(tr._buffer, list_to_buffer())
self.assertFalse(self.loop.readers)
self.assertFalse(self.loop.writers)
Expand Down Expand Up @@ -1436,7 +1436,7 @@ def check_close(self):
tr = self._make_one()
tr.close()

self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertEqual(1, self.loop.remove_reader_count[1])
self.assertEqual(tr._conn_lost, 1)

Expand Down
2 changes: 1 addition & 1 deletion tests/test_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def test_proc_exited(self):
self.assertTrue(protocol.connection_lost.called)
self.assertEqual(protocol.connection_lost.call_args[0], (None,))

self.assertFalse(transport._closed)
self.assertFalse(transport.is_closing())
self.assertIsNone(transport._loop)
self.assertIsNone(transport._proc)
self.assertIsNone(transport._protocol)
Expand Down
12 changes: 6 additions & 6 deletions tests/test_unix_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ def test__close(self, m_read):
tr = self.read_pipe_transport()
err = object()
tr._close(err)
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertFalse(self.loop.readers)
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(err)
Expand Down Expand Up @@ -598,7 +598,7 @@ def test__read_ready(self):
tr._read_ready()
self.assertFalse(self.loop.readers)
self.assertFalse(self.loop.writers)
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(None)

Expand Down Expand Up @@ -658,7 +658,7 @@ def test__write_ready_err(self, m_write, m_logexc):
self.assertFalse(self.loop.writers)
self.assertFalse(self.loop.readers)
self.assertEqual([], tr._buffer)
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
m_logexc.assert_called_with(
test_utils.MockPattern(
'Fatal write error on pipe transport'
Expand Down Expand Up @@ -694,7 +694,7 @@ def test_abort(self, m_write):
self.assertFalse(self.loop.readers)
self.assertFalse(self.loop.writers)
self.assertEqual([], tr._buffer)
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(None)

Expand Down Expand Up @@ -743,7 +743,7 @@ def test_close_closing(self):
def test_write_eof(self):
tr = self.write_pipe_transport()
tr.write_eof()
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertFalse(self.loop.readers)
test_utils.run_briefly(self.loop)
self.protocol.connection_lost.assert_called_with(None)
Expand All @@ -752,7 +752,7 @@ def test_write_eof_pending(self):
tr = self.write_pipe_transport()
tr._buffer = [b'data']
tr.write_eof()
self.assertTrue(tr._closing)
self.assertTrue(tr.is_closing())
self.assertFalse(self.protocol.connection_lost.called)


Expand Down