Issue #17801 has been updated by pebauer (peter bauer).


ioquatix (Samuel Williams) wrote in #note-1:
> Investigating.

Hello Samuel, if found the following:
**A read on a PTY master which is not ready seems to block all fibers.**
I think not ready - means 0 Bytes to read, which can be checked via IO.nread

`Workaround 1: 
Fiber.schedule do
  loop do 
    puts master.gets if master.ready? 
    sleep 0.1
  end
end

Workaround 2: # never try to read more bytes then available
Fiber.schedule do
  loop do 
    puts master.read(master.nread) if master.nread > 0 
    sleep 0.1
  end
end`


----------------------------------------
Bug #17801: repeated read from PTY blocks all Fibers
https://bugs.ruby-lang.org/issues/17801#change-91545

* Author: pebauer (peter bauer)
* Status: Open
* Priority: Normal
* Assignee: ioquatix (Samuel Williams)
* ruby -v: ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]
* Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
Ruby version:
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-linux]

used Scheduler: 
https://github.com/ruby/ruby/blob/master/test/fiber/scheduler.rb

Example Code which should work:

```
require 'pty'
require "./scheduler.rb"

line_event = TracePoint.new(:line) do |t|
  p [t.lineno, t.method_id, t.path]
end

Fiber.set_scheduler(Scheduler.new)

master, slave = PTY.open
read, write = IO.pipe
pid = spawn("bash", :in=>read, :out=>slave)
read.close     # we dont need the read
slave.close    # or the slave

line_event.enable do

Fiber.schedule do
  loop do
    puts "date"
    write.puts "date"
    sleep 1
  end
end

Fiber.schedule do
  loop do
    puts master.gets.chomp
    puts master.gets.chomp # this line blocks all fibers, why ?
    puts "test"
    sleep 1
  end
end

#write.close 
end
```





-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>