Skip to content
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
14 changes: 7 additions & 7 deletions Lib/asyncio/unix_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,19 +657,19 @@ def __init__(self, loop, pipe, protocol, waiter=None, extra=None):
# On AIX, the reader trick (to be notified when the read end of the
# socket is closed) only works for sockets. On other platforms it
# works for pipes and sockets. (Exception: OS X 10.4? Issue #19294.)
# On macOS, the trick misfires for named FIFOs (but not for pipes
# created with os.pipe(), which have st_nlink == 0): the write end
# polls as readable whenever unread data sits in the FIFO, and no
# On macOS and Solaris, the trick misfires for named FIFOs (but not for
# pipes created with os.pipe(), which have st_nlink == 0): the write
# end polls as readable whenever unread data sits in the FIFO, and no
# event is delivered when the read end is closed, so it can only
# ever report a false disconnection (gh-145030). The same xnu
# ever report a false disconnection (gh-145030). The same XNU
# behaviour applies on iOS/tvOS/watchOS (sys.platform is not
# "darwin" there).
is_named_fifo_on_apple = (
sys.platform in {"darwin", "ios", "tvos", "watchos"}
is_named_fifo_without_close_event = (
sys.platform in {"darwin", "ios", "tvos", "watchos", "sunos5"}
and is_fifo and pipe_stat.st_nlink > 0)
if is_socket or (is_fifo
and not sys.platform.startswith("aix")
and not is_named_fifo_on_apple):
and not is_named_fifo_without_close_event):
# only start reading when connection_made() has been called
self._loop.call_soon(self._loop._add_reader,
self._fileno, self._read_ready)
Expand Down
6 changes: 3 additions & 3 deletions Lib/test/test_asyncio/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -1729,9 +1729,9 @@ def reader(data):
"Don't support pipes for Windows")
@unittest.skipUnless(hasattr(os, 'mkfifo'), 'requires os.mkfifo()')
def test_write_named_fifo_unread_data(self):
# gh-145030: on macOS, the write end of a named FIFO polls as
# readable while unread data sits in the FIFO, which made the
# transport misinterpret the event as the reader hanging up
# gh-145030: on macOS and Solaris, the write end of a named FIFO
# polls as readable while unread data sits in the FIFO, which made
# the transport misinterpret the event as the reader hanging up
# and close itself.
path = os_helper.TESTFN
os.mkfifo(path)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Fix :mod:`asyncio` write pipe transports for named FIFOs on macOS. Unread
data sitting in the FIFO made the transport misinterpret a poll event as
the reader disconnecting, wrongly closing the transport.
Fix :mod:`asyncio` write pipe transports for named FIFOs on macOS and Solaris.
Unread data sitting in the FIFO made the transport misinterpret a poll event
as the reader disconnecting, wrongly closing the transport.
Loading