Issue #13851 has been updated by chucke (Tiago Cardoso).


> but I think my earlier note about using thread-local storage for short-lived buffers still applies. Per-socket buffers (which you seem to be using) would use more object slots in common situations.

Buffers are indeed attached per socket, but I wouldn't say they are short-lived. Also, I don't have guarantees that the same thread will handle the same socket after a wait, so I can't follow your advice. But I can also say that I haven't seen a big performance degradation because of it (although I'd appreciate suggestions on tools that could help me inspect this). 

----------------------------------------
Bug #13851: getting "can't modify string; temporarily locked" on non-frozen instances
https://bugs.ruby-lang.org/issues/13851#change-66554

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