From: Eric Wong Date: 2017-01-05T03:22:06+00:00 Subject: [ruby-core:78975] Re: [Ruby trunk Bug#13085] io.c io_fwrite creates garbage 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: