33
44module Concurrent
55
6+ ThreadLocalRubyStorage . i_know_it_may_leak_values!
7+
68 describe ThreadLocalVar do
79
8- subject { ThreadLocalVar . new }
10+ subject { ThreadLocalVar . new }
911
1012 context '#initialize' do
1113
@@ -20,7 +22,7 @@ module Concurrent
2022 end
2123
2224 it 'sets the same initial value for all threads' do
23- v = ThreadLocalVar . new ( 14 )
25+ v = ThreadLocalVar . new ( 14 )
2426 t1 = Thread . new { v . value }
2527 t2 = Thread . new { v . value }
2628 expect ( t1 . value ) . to eq 14
@@ -38,6 +40,19 @@ module Concurrent
3840 end
3941 end
4042
43+ unless jruby?
44+ context 'GC' do
45+ it 'does not leave values behind when bind is used' do
46+ var = ThreadLocalVar . new ( 0 )
47+ 100 . times . map do |i |
48+ Thread . new { var . bind ( i ) { var . value } }
49+ end . each ( &:join )
50+ var . value = 0
51+ expect ( var . instance_variable_get ( :@storage ) . get . size ) . to be == 1
52+ end
53+ end
54+ end
55+
4156 context '#value' do
4257
4358 it 'returns the current value' do
@@ -46,7 +61,7 @@ module Concurrent
4661 end
4762
4863 it 'returns the value after modification' do
49- v = ThreadLocalVar . new ( 14 )
64+ v = ThreadLocalVar . new ( 14 )
5065 v . value = 2
5166 expect ( v . value ) . to eq 2
5267 end
@@ -56,7 +71,7 @@ module Concurrent
5671 context '#value=' do
5772
5873 it 'sets a new value' do
59- v = ThreadLocalVar . new ( 14 )
74+ v = ThreadLocalVar . new ( 14 )
6075 v . value = 2
6176 expect ( v . value ) . to eq 2
6277 end
@@ -67,14 +82,14 @@ module Concurrent
6782 end
6883
6984 it 'does not modify the initial value for other threads' do
70- v = ThreadLocalVar . new ( 14 )
85+ v = ThreadLocalVar . new ( 14 )
7186 v . value = 2
72- t = Thread . new { v . value }
87+ t = Thread . new { v . value }
7388 expect ( t . value ) . to eq 14
7489 end
7590
7691 it 'does not modify the value for other threads' do
77- v = ThreadLocalVar . new ( 14 )
92+ v = ThreadLocalVar . new ( 14 )
7893 v . value = 2
7994
8095 b1 = CountDownLatch . new ( 2 )
0 commit comments