Skip to content

Commit f38a6c3

Browse files
committed
Make sure multiple add_reader/add_writer calls manage refs correctly
1 parent fd7a249 commit f38a6c3

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

tests/test_sockets.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,48 @@ async def client(sock, addr):
564564
w = asyncio.wait_for(c, timeout=5.0, loop=self.loop)
565565
self.loop.run_until_complete(w)
566566

567+
def test_socket_close_many_add_readers(self):
568+
s = socket.socket()
569+
with s:
570+
s.setblocking(False)
571+
self.loop.add_reader(s, lambda: None)
572+
self.loop.add_reader(s, lambda: None)
573+
self.loop.add_reader(s, lambda: None)
574+
self.loop.remove_reader(s.fileno())
575+
s.close()
576+
self.assertEqual(s.fileno(), -1)
577+
578+
s = socket.socket()
579+
with s:
580+
s.setblocking(False)
581+
self.loop.add_reader(s, lambda: None)
582+
self.loop.add_reader(s, lambda: None)
583+
self.loop.add_reader(s, lambda: None)
584+
self.loop.remove_reader(s)
585+
s.close()
586+
self.assertEqual(s.fileno(), -1)
587+
588+
def test_socket_close_many_remove_writers(self):
589+
s = socket.socket()
590+
with s:
591+
s.setblocking(False)
592+
self.loop.add_writer(s, lambda: None)
593+
self.loop.add_writer(s, lambda: None)
594+
self.loop.add_writer(s, lambda: None)
595+
self.loop.remove_writer(s.fileno())
596+
s.close()
597+
self.assertEqual(s.fileno(), -1)
598+
599+
s = socket.socket()
600+
with s:
601+
s.setblocking(False)
602+
self.loop.add_writer(s, lambda: None)
603+
self.loop.add_writer(s, lambda: None)
604+
self.loop.add_writer(s, lambda: None)
605+
self.loop.remove_writer(s)
606+
s.close()
607+
self.assertEqual(s.fileno(), -1)
608+
567609

568610
class TestAIOSockets(_TestSockets, tb.AIOTestCase):
569611
pass

uvloop/loop.pyx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,10 @@ cdef class Loop:
666666

667667
poll.start_reading(handle)
668668

669+
old_fileobj = self._fd_to_reader_fileobj.pop(fd, None)
670+
if old_fileobj is not None:
671+
socket_dec_io_ref(old_fileobj)
672+
669673
self._fd_to_reader_fileobj[fd] = fileobj
670674
socket_inc_io_ref(fileobj)
671675

@@ -711,6 +715,10 @@ cdef class Loop:
711715

712716
poll.start_writing(handle)
713717

718+
old_fileobj = self._fd_to_writer_fileobj.pop(fd, None)
719+
if old_fileobj is not None:
720+
socket_dec_io_ref(old_fileobj)
721+
714722
self._fd_to_writer_fileobj[fd] = fileobj
715723
socket_inc_io_ref(fileobj)
716724

0 commit comments

Comments
 (0)