Project

General

Profile

Actions

Bug #14542

closed

syswrite spuriously empties the given string

Added by sylvain.joyeux (Sylvain Joyeux) about 6 years ago. Updated over 5 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
-
ruby -v:
2.3.6, 2.4.3
[ruby-core:85755]

Description

I'm doing a bit of buffer management to write on a socket. The main method looks like this:

@write_buffer.concat(new_bytes) if new_bytes
written_bytes = io.syswrite(@write_buffer)
@write_buffer = @write_buffer[written_bytes..-1]
!@write_buffer.empty?

However, in some cases, I get a nil @write_buffer. I've added some debugging info:

@write_buffer.concat(new_bytes) if new_bytes
size_before_syswrite = @write_buffer.size
written_bytes = io.syswrite(@write_buffer)
size_after_syswrite = @write_buffer.size
updated_write_buffer = @write_buffer[written_bytes..-1]
if !updated_write_buffer
  STDERR.puts "NIL WRITE BUFFER, size_before_syswrite=#{size_before_syswrite} size_after_syswrite=#{size_after_syswrite} written_bytes=#{written_bytes}"
end
@write_buffer = updated_write_buffer
!@write_buffer.empty?

in all cases, I got the following output:

NIL WRITE BUFFER, size_before_syswrite=3106 size_after_syswrite=0 written_bytes=3106

However, I could not reproduce the problem with toy setups. syswrite's string handling is beyond the little I know of MRI's internals ;-)

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0