Skip to content

Commit 79a6117

Browse files
committed
Do not depend on Synchronization::LockableObject for MutexAtomicBoolean and MutexAtomicFixnum
* Similar to MutexAtomicReference. * Avoids allocating an extra ConditionVariable. * Ensure the native extension version is used on CRuby in specs.
1 parent 94d71f1 commit 79a6117

File tree

10 files changed

+47
-29
lines changed

10 files changed

+47
-29
lines changed

lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
require 'concurrent/utility/native_extension_loader' # load native parts first
2+
13
require 'concurrent/atomic/mutex_atomic_boolean'
2-
require 'concurrent/synchronization'
34

45
module Concurrent
56

@@ -79,10 +80,10 @@ module Concurrent
7980
# @!visibility private
8081
# @!macro internal_implementation_note
8182
AtomicBooleanImplementation = case
82-
when defined?(JavaAtomicBoolean)
83-
JavaAtomicBoolean
84-
when defined?(CAtomicBoolean)
83+
when Concurrent.on_cruby? && Concurrent.c_extensions_loaded?
8584
CAtomicBoolean
85+
when Concurrent.on_jruby?
86+
JavaAtomicBoolean
8687
else
8788
MutexAtomicBoolean
8889
end

lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
require 'concurrent/utility/native_extension_loader' # load native parts first
2+
13
require 'concurrent/atomic/mutex_atomic_fixnum'
2-
require 'concurrent/synchronization'
34

45
module Concurrent
56

@@ -96,10 +97,10 @@ module Concurrent
9697
# @!visibility private
9798
# @!macro internal_implementation_note
9899
AtomicFixnumImplementation = case
99-
when defined?(JavaAtomicFixnum)
100-
JavaAtomicFixnum
101-
when defined?(CAtomicFixnum)
100+
when Concurrent.on_cruby? && Concurrent.c_extensions_loaded?
102101
CAtomicFixnum
102+
when Concurrent.on_jruby?
103+
JavaAtomicFixnum
103104
else
104105
MutexAtomicFixnum
105106
end

lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
require 'concurrent/utility/native_extension_loader' # load native parts first
22

3-
require 'concurrent/utility/engine'
43
require 'concurrent/atomic_reference/numeric_cas_wrapper'
54

65
# Shim for TruffleRuby::AtomicReference

lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
require 'concurrent/synchronization'
2-
31
module Concurrent
42

53
# @!macro atomic_boolean
64
# @!visibility private
75
# @!macro internal_implementation_note
8-
class MutexAtomicBoolean < Synchronization::LockableObject
6+
class MutexAtomicBoolean
97

108
# @!macro atomic_boolean_method_initialize
119
def initialize(initial = false)
1210
super()
11+
@__Lock__ = ::Mutex.new
12+
# This synchronize should be good enough to ensure safe initialization
1313
synchronize { ns_initialize(initial) }
1414
end
1515

@@ -45,6 +45,15 @@ def make_false
4545

4646
protected
4747

48+
# @!visibility private
49+
def synchronize
50+
if @__Lock__.owned?
51+
yield
52+
else
53+
@__Lock__.synchronize { yield }
54+
end
55+
end
56+
4857
# @!visibility private
4958
def ns_initialize(initial)
5059
@value = !!initial

lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
require 'concurrent/synchronization'
21
require 'concurrent/utility/native_integer'
32

43
module Concurrent
54

65
# @!macro atomic_fixnum
76
# @!visibility private
87
# @!macro internal_implementation_note
9-
class MutexAtomicFixnum < Synchronization::LockableObject
8+
class MutexAtomicFixnum
109

1110
# @!macro atomic_fixnum_method_initialize
1211
def initialize(initial = 0)
1312
super()
13+
@__Lock__ = ::Mutex.new
14+
# This synchronize should be good enough to ensure safe initialization
1415
synchronize { ns_initialize(initial) }
1516
end
1617

@@ -59,6 +60,15 @@ def update
5960

6061
protected
6162

63+
# @!visibility private
64+
def synchronize
65+
if @__Lock__.owned?
66+
yield
67+
else
68+
@__Lock__.synchronize { yield }
69+
end
70+
end
71+
6272
# @!visibility private
6373
def ns_initialize(initial)
6474
ns_set(initial)

lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def _compare_and_set(old_value, new_value)
5151

5252
protected
5353

54+
# @!visibility private
5455
def synchronize
5556
if @__Lock__.owned?
5657
yield
@@ -59,6 +60,7 @@ def synchronize
5960
end
6061
end
6162

63+
# @!visibility private
6264
def ns_initialize(value)
6365
@value = value
6466
end

lib/concurrent-ruby/concurrent/utility/engine.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ module Utility
33

44
# @!visibility private
55
module EngineDetector
6-
def on_jruby?
7-
RUBY_ENGINE == 'jruby'
8-
end
9-
106
def on_cruby?
117
RUBY_ENGINE == 'ruby'
128
end
139

10+
def on_jruby?
11+
RUBY_ENGINE == 'jruby'
12+
end
13+
1414
def on_truffleruby?
1515
RUBY_ENGINE == 'truffleruby'
1616
end

spec/concurrent/atomic/atomic_boolean_spec.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,13 @@ module Concurrent
140140
end
141141
end
142142

143-
if defined? Concurrent::CAtomicBoolean
144-
143+
if Concurrent.allow_c_extensions?
145144
RSpec.describe CAtomicBoolean do
146145
it_should_behave_like :atomic_boolean
147146
end
148147
end
149148

150149
if Concurrent.on_jruby?
151-
152150
RSpec.describe JavaAtomicBoolean do
153151
it_should_behave_like :atomic_boolean
154152
end
@@ -165,7 +163,7 @@ module Concurrent
165163
it 'inherits from JavaAtomicBoolean' do
166164
expect(AtomicBoolean.ancestors).to include(JavaAtomicBoolean)
167165
end
168-
elsif defined? Concurrent::CAtomicBoolean
166+
elsif Concurrent.allow_c_extensions?
169167
it 'inherits from CAtomicBoolean' do
170168
expect(AtomicBoolean.ancestors).to include(CAtomicBoolean)
171169
end

spec/concurrent/atomic/atomic_fixnum_spec.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,15 +202,13 @@ module Concurrent
202202
end
203203
end
204204

205-
if defined? Concurrent::CAtomicFixnum
206-
205+
if Concurrent.allow_c_extensions?
207206
RSpec.describe CAtomicFixnum do
208207
it_should_behave_like :atomic_fixnum
209208
end
210209
end
211210

212211
if Concurrent.on_jruby?
213-
214212
RSpec.describe JavaAtomicFixnum do
215213
it_should_behave_like :atomic_fixnum
216214
end
@@ -227,7 +225,7 @@ module Concurrent
227225
it 'inherits from JavaAtomicFixnum' do
228226
expect(AtomicFixnum.ancestors).to include(JavaAtomicFixnum)
229227
end
230-
elsif defined? Concurrent::CAtomicFixnum
228+
elsif Concurrent.allow_c_extensions?
231229
it 'inherits from CAtomicFixnum' do
232230
expect(AtomicFixnum.ancestors).to include(CAtomicFixnum)
233231
end

spec/concurrent/atomic/atomic_reference_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,17 @@ module Concurrent
161161
it_should_behave_like :atomic_reference
162162
end
163163

164-
if defined? Concurrent::CAtomicReference
164+
if Concurrent.allow_c_extensions?
165165
RSpec.describe CAtomicReference do
166166
it_should_behave_like :atomic_reference
167167
end
168168
end
169-
if defined? Concurrent::JavaAtomicReference
169+
if Concurrent.on_jruby?
170170
RSpec.describe JavaAtomicReference do
171171
it_should_behave_like :atomic_reference
172172
end
173173
end
174-
if defined? Concurrent::TruffleRubyAtomicReference
174+
if Concurrent.on_truffleruby?
175175
RSpec.describe TruffleRubyAtomicReference do
176176
it_should_behave_like :atomic_reference
177177
end

0 commit comments

Comments
 (0)