[ruby-core:78975] Re: [Ruby trunk Bug#13085] io.c io_fwrite creates garbage

From: Eric Wong <normalperson@...>
Date: 2017-01-05 03:22:06 UTC
List: ruby-core #78975
nobu@ruby-lang.org wrote:
> No.
> Your patch releases the GVL while unfreezing the string to be written.
> If the write operation is blocked, other threads can clobber that string.

It does?

fwrite_unfreeze happens in rb_ensure e_proc, which has GVL.

 From what I can tell, GVL release happens only inside
fwrite_freeze (rb_ensure b_proc):

    fwrite_freeze (rb_ensure b_proc)
        io_binwrite
            rb_mutex_synchronize(fptr->write_lock...)
                rb_mutex_lock = NOGVL
                io_binwrite_string (identical as below:)
            io_binwrite_string
                rb_writev_internal
                    rb_thread_io_blocking_region = NOGVL
                rb_write_internal
                    rb_thread_io_blocking_region = NOGVL
            rb_io_wait_writable = NOGVL


By the time e_proc (fwrite_unfreeze) is called by rb_ensure
we have GVL, again.

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

In This Thread

Prev Next