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


Nobu told me it is because of different buffering with writev, i.e. no buffering.
Nobu fixed it in r60535.
The spec was also racy (child #write+flush raced with parent #close), so I fixed it in r60567.

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

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