Issue #14042 has been updated by Eregon (Benoit Daloze).


I think it would be safer to only do this if we know we are calling the original IO#write.
Seeing r60428 and how it breaks mspec too, the current approach sounds not compatible enough.

For instance, if write is defined as write(*args), there is no way to know whether that the arguments are just passed to IO#write or does some of its own parsing, which will very likely break with this change.
As an example (not realistic as only keeps the last call to #write),

    require 'pathname'
    $stdout = Pathname.new("log")
    puts "foo"

raises an error with this change.

----------------------------------------
Feature #14042: IO#puts: use writev if available
https://bugs.ruby-lang.org/issues/14042#change-67605

* Author: rohitpaulk (Paul Kuruvilla)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
Hi, 

I've attached a patch to make IO#puts use writev if available. Currently, IO#puts calls `write` twice: Once to write the string, and the second to write a newline (if the string doesn't end with one already). With this patch, those two calls are replaced with a single `writev` call.


A test has been added that demonstrates the problem. 

For a bit of background: 

* A related issue: https://bugs.ruby-lang.org/issues/9420. (I couldn't figure out a way to 'attach' my patch to that issue, so I'm creating a new one)
* A blog post I wrote a while back about this: https://hackernoon.com/rubys-puts-is-not-atomic-889c57fc9a28

Command I used to run the test I added: `make test-all TESTS='ruby/test_io.rb -n test_puts_parallel'`


I'm a first time contributor, a bit confused as to where a changelog entry should be added. Is the `NEWS` file the right place?

Regards,
Paul

---Files--------------------------------
ruby-changes.patch (2.83 KB)


-- 
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>