Skip to content

Commit b4f188e

Browse files
committed
Fix remove_reader and remove_writer to only decref prev added sockets
1 parent 502bf99 commit b4f188e

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

tests/test_sockets.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,42 @@ async def client(sock, addr):
469469
self.loop.close()
470470
self.assertEqual(sock.fileno(), -1)
471471

472+
def test_socket_close_remove_reader(self):
473+
s = socket.socket()
474+
with s:
475+
s.setblocking(False)
476+
self.loop.add_reader(s, lambda: None)
477+
self.loop.remove_reader(s.fileno())
478+
s.close()
479+
self.assertEqual(s.fileno(), -1)
480+
481+
s = socket.socket()
482+
with s:
483+
s.setblocking(False)
484+
self.loop.add_reader(s.fileno(), lambda: None)
485+
self.loop.remove_reader(s)
486+
self.assertNotEqual(s.fileno(), -1)
487+
s.close()
488+
self.assertEqual(s.fileno(), -1)
489+
490+
def test_socket_close_remove_writer(self):
491+
s = socket.socket()
492+
with s:
493+
s.setblocking(False)
494+
self.loop.add_writer(s, lambda: None)
495+
self.loop.remove_writer(s.fileno())
496+
s.close()
497+
self.assertEqual(s.fileno(), -1)
498+
499+
s = socket.socket()
500+
with s:
501+
s.setblocking(False)
502+
self.loop.add_writer(s.fileno(), lambda: None)
503+
self.loop.remove_writer(s)
504+
self.assertNotEqual(s.fileno(), -1)
505+
s.close()
506+
self.assertEqual(s.fileno(), -1)
507+
472508

473509
class TestAIOSockets(_TestSockets, tb.AIOTestCase):
474510
pass

uvloop/loop.pyx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -664,8 +664,9 @@ cdef class Loop:
664664
poll = UVPoll.new(self, fd)
665665
self._polls[fd] = poll
666666

667-
self._fd_to_reader_fileobj[fd] = fileobj
668667
poll.start_reading(handle)
668+
669+
self._fd_to_reader_fileobj[fd] = fileobj
669670
socket_inc_io_ref(fileobj)
670671

671672
cdef _remove_reader(self, fileobj):
@@ -674,8 +675,10 @@ cdef class Loop:
674675

675676
fd = self._fileobj_to_fd(fileobj)
676677
self._ensure_fd_no_transport(fd)
677-
self._fd_to_reader_fileobj.pop(fd, None)
678-
socket_dec_io_ref(fileobj)
678+
679+
mapped_fileobj = self._fd_to_reader_fileobj.pop(fd, None)
680+
if mapped_fileobj is not None:
681+
socket_dec_io_ref(mapped_fileobj)
679682

680683
if self._closed == 1:
681684
return False
@@ -706,8 +709,9 @@ cdef class Loop:
706709
poll = UVPoll.new(self, fd)
707710
self._polls[fd] = poll
708711

709-
self._fd_to_writer_fileobj[fd] = fileobj
710712
poll.start_writing(handle)
713+
714+
self._fd_to_writer_fileobj[fd] = fileobj
711715
socket_inc_io_ref(fileobj)
712716

713717
cdef _remove_writer(self, fileobj):
@@ -716,8 +720,10 @@ cdef class Loop:
716720

717721
fd = self._fileobj_to_fd(fileobj)
718722
self._ensure_fd_no_transport(fd)
719-
self._fd_to_writer_fileobj.pop(fd, None)
720-
socket_dec_io_ref(fileobj)
723+
724+
mapped_fileobj = self._fd_to_writer_fileobj.pop(fd, None)
725+
if mapped_fileobj is not None:
726+
socket_dec_io_ref(mapped_fileobj)
721727

722728
if self._closed == 1:
723729
return False

0 commit comments

Comments
 (0)