From c4cbc968c55e5b983dae953095761896220c46d1 Mon Sep 17 00:00:00 2001 From: Petr Chalupa Date: Fri, 28 Aug 2020 14:34:54 +0200 Subject: [PATCH] Do not iterate over hash which might conflict with new pair addition --- .../concurrent/atomic/ruby_thread_local_var.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb b/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb index 6d7601afd..9a51eb288 100644 --- a/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb +++ b/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb @@ -97,7 +97,10 @@ def self.thread_local_finalizer(index) # The cost of GC'ing a TLV is linear in the number of threads using TLVs # But that is natural! More threads means more storage is used per TLV # So naturally more CPU time is required to free more storage - THREAD_LOCAL_ARRAYS.each_value { |array| array[index] = nil } + # + # DO NOT use each_value which might conflict with new pair assignment + # into the hash in #value= method + THREAD_LOCAL_ARRAYS.values.each { |array| array[index] = nil } # free index has to be published after the arrays are cleared FREE.push(index) end