Bug #20231
closedDon't wait in io_binwrite_string if not necessary.
Description
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.
Updated by ioquatix (Samuel Williams) 7 months ago
- Assignee set to ioquatix (Samuel Williams)
Updated by ioquatix (Samuel Williams) 7 months ago
- Status changed from Open to Closed
Updated by naruse (Yui NARUSE) 7 months ago
Merging into 3.3 but failed
https://github.com/ruby/ruby/pull/9813
Updated by ioquatix (Samuel Williams) 7 months ago
@naruse (Yui NARUSE) That PR seems unrelated, is the link correct?
Updated by naruse (Yui NARUSE) 7 months ago
ioquatix (Samuel Williams) wrote in #note-4:
@naruse (Yui NARUSE) That PR seems unrelated, is the link correct?
Thanks, the correct PR is https://github.com/ruby/ruby/pull/9831
Updated by naruse (Yui NARUSE) 7 months ago
- Backport changed from 3.2: REQUIRED, 3.3: REQUIRED to 3.2: REQUIRED, 3.3: DONE
ruby_3_3 2c365e6dfb95e0df24725c6f377b9cdf5e354557 merged revision(s) 2554c5d3b8738a248cedb2fea96dfab9fbe19417.
Updated by nagachika (Tomoyuki Chikanaga) 5 months ago
- Backport changed from 3.2: REQUIRED, 3.3: DONE to 3.2: DONE, 3.3: DONE
ruby_3_2 bf6e9299ef4f10dbd23f32331c355ac875bfb5e3 merged revision(s) 2554c5d3b8738a248cedb2fea96dfab9fbe19417.