[#61424] [REJECT?] xmalloc/xfree: reduce atomic ops w/ thread-locals — Eric Wong <normalperson@...>

I'm unsure about this. I _hate_ the extra branches this adds;

13 messages 2014/03/12

[ruby-core:61169] [ruby-trunk - Bug #9583] [Rejected] Open3 cannot talk correctly with Ruby when there is a large DATA segment passed through stdin. Broken pipe (Errno::EPIPE)

From: akr@...
Date: 2014-03-01 09:09:49 UTC
List: ruby-core #61169
Issue #9583 has been updated by Akira Tanaka.

Status changed from Open to Rejected

EPIPE is raised because ruby doesn't read the script file after __END__ (unless the script read from DATA).
So the ruby invoked by Open3.popen3 can exit before i.write is finished.
It actually happen if the script is long enough.
If it is happen, i.write fails with EPIPE.

If the script doesn't contain __END__ (as your last example), ruby reads the entire script.
So the ruby invoked by Open3.popen3 don't exit before i.close is finished.
So EPIPE is not raised.

----------------------------------------
Bug #9583: Open3 cannot talk correctly with Ruby when there is a large DATA segment passed through stdin. Broken pipe (Errno::EPIPE)
https://bugs.ruby-lang.org/issues/9583#change-45534

* Author: Josh Cheek
* Status: Rejected
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.2.0dev (2014-03-01 trunk 45219) [x86_64-darwin12.0]
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
$ # Tested against 
$ ruby -v
ruby 2.2.0dev (2014-03-01 trunk 45219) [x86_64-darwin12.0]


Example
$ ruby -e 'puts "__END__"; puts "."*24_568' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }'
-e:1:in `write': Broken pipe (Errno::EPIPE)
	from -e:1:in `block in <main>'
	from /Users/josh/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/open3.rb:217:in `popen_run'
	from /Users/josh/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/open3.rb:99:in `popen3'
	from -e:1:in `<main>'

If we reduce the size of the data segment by 1 character, it works:
$ ruby -e 'puts "__END__"; puts "."*24_567' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }'

If we take it out of the data segment, it is fine
$ ruby -e 'puts "#" + "."*100_000' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }'



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

In This Thread

Prev Next