Project

General

Profile

Actions

Bug #20231

closed

Don't wait in io_binwrite_string if not necessary.

Added by ioquatix (Samuel Williams) 3 months ago. Updated 26 days ago.

Status:
Closed
Target version:
-
ruby -v:
[ruby-core:116534]

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) 3 months ago

  • Assignee set to ioquatix (Samuel Williams)
Actions #2

Updated by ioquatix (Samuel Williams) 3 months ago

  • Status changed from Open to Closed

Updated by ioquatix (Samuel Williams) 3 months ago

@naruse (Yui NARUSE) That PR seems unrelated, is the link correct?

Updated by naruse (Yui NARUSE) 3 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) 3 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) 27 days 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0