Issue #20231 has been updated by naruse (Yui NARUSE).
ioquatix (Samuel Williams) wrote in #note-4:
@naruse That PR seems unrelated, is the link correct?
Thanks, the correct PR is
https://github.com/ruby/ruby/pull/9831
----------------------------------------
Bug #20231: Don't wait in io_binwrite_string if not necessary.
https://bugs.ruby-lang.org/issues/20231#change-106596
* Author: ioquatix (Samuel Williams)
* Status: Closed
* Priority: Normal
* Assignee: ioquatix (Samuel Williams)
* Backport: 3.2: REQUIRED, 3.3: REQUIRED
----------------------------------------
PR:
https://github.com/ruby/ruby/pull/9792
Writing to a buffered IO can result in the entire internal buffer being flushed, which
causes `io_binwrite_string_internal` to return 0. In that case, we were setting `errno =
EAGAIN`. This causes `rb_io_maybe_wait_writable` to be invoked, however we should
immediately retry `io_binwrite_string_internal` instead.
The reason why calling `rb_io_maybe_wait_writable` is a bad idea in general, is that not
all IO can go via this mechanism in every situation - in other words, `kqueue` does not
support `kevent("/dev/null", writable)` and returns errno=22 `EINVAL`. The same
applies to some kinds of pipes, TTYs, etc.
Indirectly responsible for <https://github.com/socketry/async/issues/301>.
--
https://bugs.ruby-lang.org/