Skip to content

Commit 4a03335

Browse files
committedFeb 11, 2016
protocols/pipe_ipc: fix read transport resource leak
This caused the "Exception ignored in:" message on exit.
1 parent 29d4755 commit 4a03335

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed
 

‎artiq/protocols/pipe_ipc.py

+12-12
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,14 @@ async def read(self, n):
2424
async def _fds_to_asyncio(rfd, wfd, loop):
2525
reader = asyncio.StreamReader(loop=loop)
2626
reader_protocol = asyncio.StreamReaderProtocol(reader, loop=loop)
27+
rf = open(rfd, "rb", 0)
28+
rt, _ = await loop.connect_read_pipe(lambda: reader_protocol, rf)
2729

2830
wf = open(wfd, "wb", 0)
29-
transport, _ = await loop.connect_write_pipe(
30-
FlowControlMixin, wf)
31-
writer = asyncio.StreamWriter(transport, reader_protocol,
32-
None, loop)
33-
34-
rf = open(rfd, "rb", 0)
35-
await loop.connect_read_pipe(lambda: reader_protocol, rf)
31+
wt, _ = await loop.connect_write_pipe(FlowControlMixin, wf)
32+
writer = asyncio.StreamWriter(wt, reader_protocol, None, loop)
3633

37-
return reader, writer
34+
return rt, reader, writer
3835

3936

4037
class AsyncioParentComm(_BaseIO):
@@ -47,6 +44,7 @@ def get_address(self):
4744

4845
async def _autoclose(self):
4946
await self.process.wait()
47+
self.reader_transport.close()
5048
self.writer.close()
5149

5250
async def create_subprocess(self, *args, **kwargs):
@@ -56,8 +54,8 @@ async def create_subprocess(self, *args, **kwargs):
5654
os.close(self.c_rfd)
5755
os.close(self.c_wfd)
5856

59-
self.reader, self.writer = await _fds_to_asyncio(
60-
self.p_rfd, self.p_wfd, loop)
57+
self.reader_transport, self.reader, self.writer = \
58+
await _fds_to_asyncio(self.p_rfd, self.p_wfd, loop)
6159
asyncio.ensure_future(self._autoclose())
6260

6361

@@ -67,10 +65,12 @@ def __init__(self, address):
6765

6866
async def connect(self):
6967
rfd, wfd = self.address.split(",", maxsplit=1)
70-
self.reader, self.writer = await _fds_to_asyncio(
71-
int(rfd), int(wfd), asyncio.get_event_loop())
68+
self.reader_transport, self.reader, self.writer = \
69+
await _fds_to_asyncio(int(rfd), int(wfd),
70+
asyncio.get_event_loop())
7271

7372
def close(self):
73+
self.reader_transport.close()
7474
self.writer.close()
7575

7676

0 commit comments

Comments
 (0)