Issue #13851 has been updated by chucke (Tiago Cardoso). I've been struggling to create a self-contained script to reproduce the problem, but can't seem to. The problem is that I'm doing all socket monitoring in one thread, and read/write operations on another. Is there any thread-unsafety associated with such operations happening at the same time? In my research, I've found this: https://bugs.ruby-lang.org/issues/8669 , which establishes a precedent (I also believe that my problem is a buffer being temporarily locked somewhere). I've also firmly believe that the problem is the `IO#read_nonblock(nread, buffer)` API (the second argument). When I do the same logic by returning the read buffer (`IO#read_nonblock(nread)`), the error doesn't happen. Passing `exception: false` is irrelevant (error is raised with or without it). ---------------------------------------- Bug #13851: getting "can't modify string; temporarily locked" on non-frozen instances https://bugs.ruby-lang.org/issues/13851#change-66488 * Author: chucke (Tiago Cardoso) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.3.4 * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- I'm doing some nonblocking IO, and using a local string for buffering to avoid allocations. Roughly the following ```ruby class A def initialize @buffer = String.new("", encoding: Encoding::BINARY) end def read(io) io.read_nonblock(16_384, @buffer, exception: false) # do stuff... @buffer.clear end ``` It all goes smoothly, mostly... until I start getting arbitrary error when calling `#read_nonblock`. Here's an example backtrace: ``` DEBUG: can't modify string; temporarily locked- - - [30/Aug/2017:13:15:09 +0300] "GET / 1.0" 200 - 0.0000 DEBUG: <internal:prelude>:76:in `__read_nonblock' DEBUG: <internal:prelude>:76:in `read_nonblock' DEBUG: /Users/user/Projects/project:NN in `read`` .... ``` I can't unfortunately reproduce this in a deterministic way. I can only say that the `read` routine is called in multiple threads (different io's instances of that class). The errors come seldom, however. I'm running ruby 2.3.4, and the frozen string literal is activated for the file where the class is defined. I first assumed that it was the buffer, but due to its initialization, it should be marken as not-frozen. -- 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>