From: "ioquatix (Samuel Williams)" Date: 2021-12-16T07:58:58+00:00 Subject: [ruby-core:106707] [Ruby master Bug#18411] Introduce `Fiber.blocking` for disabling scheduler. Issue #18411 has been reported by ioquatix (Samuel Williams). ---------------------------------------- Bug #18411: Introduce `Fiber.blocking` for disabling scheduler. https://bugs.ruby-lang.org/issues/18411 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- When implementing pure-ruby IO scheduler, we may need to invoke some Ruby IO operations without entering the scheduler. ```ruby def io_write(fiber, io, buffer, length) offset = 0 while length > 0 # From offset until the end: chunk = buffer.to_str(offset, length) case result = io.write_nonblock(chunk, exception: false) when :wait_readable self.io_wait(fiber, io, IO::READABLE) when :wait_writable self.io_wait(fiber, io, IO::WRITABLE) else offset += result length -= result end end return offset end ``` There are some cases where even in this code `read_nonblock` can invoke fiber scheduler creating infinite recursion. Therefore, I propose to introduce `Fiber.blocking{...}` which has almost identical implementation to `Fiber.new(blocking: true) {}.resume`. -- https://bugs.ruby-lang.org/ Unsubscribe: