concurrent-ruby 1.1.10 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -1
- data/Gemfile +0 -1
- data/README.md +21 -20
- data/Rakefile +46 -57
- data/ext/concurrent-ruby/com/concurrent_ruby/ext/SynchronizationLibrary.java +10 -25
- data/lib/concurrent-ruby/concurrent/agent.rb +2 -1
- data/lib/concurrent-ruby/concurrent/array.rb +0 -10
- data/lib/concurrent-ruby/concurrent/atom.rb +1 -1
- data/lib/concurrent-ruby/concurrent/atomic/atomic_boolean.rb +5 -4
- data/lib/concurrent-ruby/concurrent/atomic/atomic_fixnum.rb +5 -4
- data/lib/concurrent-ruby/concurrent/atomic/atomic_markable_reference.rb +3 -0
- data/lib/concurrent-ruby/concurrent/atomic/atomic_reference.rb +81 -151
- data/lib/concurrent-ruby/concurrent/atomic/cyclic_barrier.rb +1 -1
- data/lib/concurrent-ruby/concurrent/atomic/event.rb +1 -1
- data/lib/concurrent-ruby/concurrent/atomic/fiber_local_var.rb +109 -0
- data/lib/concurrent-ruby/concurrent/atomic/java_count_down_latch.rb +1 -0
- data/lib/concurrent-ruby/concurrent/atomic/locals.rb +188 -0
- data/lib/concurrent-ruby/concurrent/atomic/lock_local_var.rb +28 -0
- data/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_boolean.rb +11 -5
- data/lib/concurrent-ruby/concurrent/atomic/mutex_atomic_fixnum.rb +11 -5
- data/lib/concurrent-ruby/concurrent/atomic/mutex_count_down_latch.rb +1 -1
- data/lib/concurrent-ruby/concurrent/atomic/mutex_semaphore.rb +1 -1
- data/lib/concurrent-ruby/concurrent/atomic/read_write_lock.rb +2 -1
- data/lib/concurrent-ruby/concurrent/atomic/reentrant_read_write_lock.rb +5 -3
- data/lib/concurrent-ruby/concurrent/atomic/semaphore.rb +6 -9
- data/lib/concurrent-ruby/concurrent/atomic/thread_local_var.rb +96 -89
- data/lib/concurrent-ruby/concurrent/atomic_reference/atomic_direct_update.rb +37 -0
- data/lib/concurrent-ruby/concurrent/atomic_reference/mutex_atomic.rb +15 -4
- data/lib/concurrent-ruby/concurrent/collection/copy_on_notify_observer_set.rb +1 -1
- data/lib/concurrent-ruby/concurrent/collection/copy_on_write_observer_set.rb +1 -1
- data/lib/concurrent-ruby/concurrent/collection/lock_free_stack.rb +2 -0
- data/lib/concurrent-ruby/concurrent/concern/logging.rb +86 -2
- data/lib/concurrent-ruby/concurrent/concurrent_ruby.jar +0 -0
- data/lib/concurrent-ruby/concurrent/configuration.rb +4 -87
- data/lib/concurrent-ruby/concurrent/delay.rb +2 -2
- data/lib/concurrent-ruby/concurrent/errors.rb +5 -0
- data/lib/concurrent-ruby/concurrent/exchanger.rb +1 -0
- data/lib/concurrent-ruby/concurrent/executor/abstract_executor_service.rb +1 -1
- data/lib/concurrent-ruby/concurrent/executor/java_executor_service.rb +2 -2
- data/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb +1 -1
- data/lib/concurrent-ruby/concurrent/executor/serialized_execution.rb +1 -1
- data/lib/concurrent-ruby/concurrent/executor/simple_executor_service.rb +4 -1
- data/lib/concurrent-ruby/concurrent/hash.rb +0 -9
- data/lib/concurrent-ruby/concurrent/immutable_struct.rb +1 -1
- data/lib/concurrent-ruby/concurrent/ivar.rb +2 -1
- data/lib/concurrent-ruby/concurrent/map.rb +9 -8
- data/lib/concurrent-ruby/concurrent/maybe.rb +1 -1
- data/lib/concurrent-ruby/concurrent/mutable_struct.rb +1 -1
- data/lib/concurrent-ruby/concurrent/mvar.rb +1 -1
- data/lib/concurrent-ruby/concurrent/promise.rb +1 -1
- data/lib/concurrent-ruby/concurrent/promises.rb +7 -6
- data/lib/concurrent-ruby/concurrent/re_include.rb +2 -0
- data/lib/concurrent-ruby/concurrent/scheduled_task.rb +1 -1
- data/lib/concurrent-ruby/concurrent/set.rb +0 -10
- data/lib/concurrent-ruby/concurrent/settable_struct.rb +2 -2
- data/lib/concurrent-ruby/concurrent/synchronization/abstract_lockable_object.rb +5 -1
- data/lib/concurrent-ruby/concurrent/synchronization/abstract_object.rb +1 -3
- data/lib/concurrent-ruby/concurrent/synchronization/condition.rb +2 -0
- data/lib/concurrent-ruby/concurrent/synchronization/full_memory_barrier.rb +29 -0
- data/lib/concurrent-ruby/concurrent/synchronization/jruby_lockable_object.rb +3 -1
- data/lib/concurrent-ruby/concurrent/synchronization/lock.rb +2 -0
- data/lib/concurrent-ruby/concurrent/synchronization/lockable_object.rb +5 -2
- data/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb +6 -5
- data/lib/concurrent-ruby/concurrent/synchronization/object.rb +12 -44
- data/lib/concurrent-ruby/concurrent/synchronization/safe_initialization.rb +36 -0
- data/lib/concurrent-ruby/concurrent/synchronization/volatile.rb +77 -12
- data/lib/concurrent-ruby/concurrent/synchronization.rb +1 -18
- data/lib/concurrent-ruby/concurrent/thread_safe/synchronized_delegator.rb +36 -39
- data/lib/concurrent-ruby/concurrent/thread_safe/util/cheap_lockable.rb +2 -39
- data/lib/concurrent-ruby/concurrent/thread_safe/util/data_structures.rb +1 -37
- data/lib/concurrent-ruby/concurrent/tuple.rb +1 -5
- data/lib/concurrent-ruby/concurrent/tvar.rb +2 -1
- data/lib/concurrent-ruby/concurrent/utility/engine.rb +5 -16
- data/lib/concurrent-ruby/concurrent/utility/monotonic_time.rb +3 -74
- data/lib/concurrent-ruby/concurrent/utility/native_extension_loader.rb +8 -10
- data/lib/concurrent-ruby/concurrent/utility/native_integer.rb +1 -0
- data/lib/concurrent-ruby/concurrent/utility/processor_counter.rb +34 -54
- data/lib/concurrent-ruby/concurrent/version.rb +1 -1
- metadata +13 -15
- data/lib/concurrent-ruby/concurrent/atomic/abstract_thread_local_var.rb +0 -66
- data/lib/concurrent-ruby/concurrent/atomic/java_thread_local_var.rb +0 -37
- data/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb +0 -181
- data/lib/concurrent-ruby/concurrent/synchronization/jruby_object.rb +0 -45
- data/lib/concurrent-ruby/concurrent/synchronization/mri_object.rb +0 -44
- data/lib/concurrent-ruby/concurrent/synchronization/rbx_lockable_object.rb +0 -71
- data/lib/concurrent-ruby/concurrent/synchronization/rbx_object.rb +0 -49
- data/lib/concurrent-ruby/concurrent/synchronization/truffleruby_object.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f224c72d89a1bd079ad1086c9ed28a1d4d6432c718b9e0624c9a32afc8500cc8
|
4
|
+
data.tar.gz: dfb811189c8e7eeb2ea1f17fc1e680657dffe767c77bb09312e85a4f29f2bd60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 807b1aac5e1bdee569df0b9e38fff1ed339f2c8569cd0a7ab565cbbecb23ffc9c6cf968e457e2acecf3abd187ac43da16dc2fb91716c912e78c08aa122dcaf0e
|
7
|
+
data.tar.gz: 07c37140aa1417ad32daa0de92f4c0883c7a96c1c53fba9aa09e34598632b3ad274283034064df41181e59964d0c79e41d083f17912e8e121c4f2d774c988b81
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
## Current
|
2
2
|
|
3
|
-
## Release v1.
|
3
|
+
## Release v1.2.0 (23 Jan 2023)
|
4
|
+
|
5
|
+
* (#962) Fix ReentrantReadWriteLock to use the same granularity for locals as for Mutex it uses.
|
6
|
+
* (#983) Add FiberLocalVar
|
7
|
+
* (#934) concurrent-ruby now supports requiring individual classes (public classes listed in the docs), e.g., `require 'concurrent/map'`
|
8
|
+
* (#976) Let `Promises.any_fulfilled_future` take an `Event`
|
9
|
+
* Improve documentation of various classes
|
10
|
+
* (#975) Set the Ruby compatibility version at 2.3
|
11
|
+
* (#972) Remove Rubinius-related code
|
12
|
+
|
13
|
+
## Release v1.1.10 (22 Mar 2022)
|
4
14
|
|
5
15
|
concurrent-ruby:
|
6
16
|
|
data/Gemfile
CHANGED
@@ -2,7 +2,6 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
require File.join(File.dirname(__FILE__), 'lib/concurrent-ruby/concurrent/version')
|
4
4
|
require File.join(File.dirname(__FILE__ ), 'lib/concurrent-ruby-edge/concurrent/edge/version')
|
5
|
-
require File.join(File.dirname(__FILE__ ), 'lib/concurrent-ruby/concurrent/utility/engine')
|
6
5
|
|
7
6
|
no_path = ENV['NO_PATH']
|
8
7
|
options = no_path ? {} : { path: '.' }
|
data/README.md
CHANGED
@@ -42,8 +42,8 @@ You can also get started by triaging issues which may include reproducing bug re
|
|
42
42
|
## Thread Safety
|
43
43
|
|
44
44
|
*Concurrent Ruby makes one of the strongest thread safety guarantees of any Ruby concurrency
|
45
|
-
library, providing consistent behavior and guarantees on all
|
46
|
-
(MRI/CRuby, JRuby,
|
45
|
+
library, providing consistent behavior and guarantees on all three main Ruby interpreters
|
46
|
+
(MRI/CRuby, JRuby, TruffleRuby).*
|
47
47
|
|
48
48
|
Every abstraction in this library is thread safe. Specific thread safety guarantees are documented
|
49
49
|
with each abstraction.
|
@@ -58,9 +58,9 @@ other Ruby library, many of which support the mantra of
|
|
58
58
|
Concurrent Ruby is also the only Ruby library which provides a full suite of thread safe and
|
59
59
|
immutable variable types and data structures.
|
60
60
|
|
61
|
-
We've also initiated discussion to document [memory model](docs-source/synchronization.md) of Ruby which
|
62
|
-
would provide consistent behaviour and guarantees on all
|
63
|
-
(MRI/CRuby, JRuby,
|
61
|
+
We've also initiated discussion to document the [memory model](docs-source/synchronization.md) of Ruby which
|
62
|
+
would provide consistent behaviour and guarantees on all three main Ruby interpreters
|
63
|
+
(MRI/CRuby, JRuby, TruffleRuby).
|
64
64
|
|
65
65
|
## Features & Documentation
|
66
66
|
|
@@ -259,13 +259,10 @@ be obeyed though. Features developed in `concurrent-ruby-edge` are expected to m
|
|
259
259
|
|
260
260
|
## Supported Ruby versions
|
261
261
|
|
262
|
-
* MRI 2.
|
262
|
+
* MRI 2.3 and above
|
263
263
|
* Latest JRuby 9000
|
264
264
|
* Latest TruffleRuby
|
265
265
|
|
266
|
-
The legacy support for Rubinius is kept for the moment but it is no longer maintained and is liable to be removed. If you would like to help
|
267
|
-
please respond to [#739](https://github.com/ruby-concurrency/concurrent-ruby/issues/739).
|
268
|
-
|
269
266
|
## Usage
|
270
267
|
|
271
268
|
Everything within this gem can be loaded simply by requiring it:
|
@@ -274,7 +271,12 @@ Everything within this gem can be loaded simply by requiring it:
|
|
274
271
|
require 'concurrent'
|
275
272
|
```
|
276
273
|
|
277
|
-
|
274
|
+
You can also require a specific abstraction [part of the public documentation](https://ruby-concurrency.github.io/concurrent-ruby/master/index.html) since concurrent-ruby 1.2.0, for example:
|
275
|
+
```ruby
|
276
|
+
require 'concurrent/map'
|
277
|
+
require 'concurrent/atomic/atomic_reference'
|
278
|
+
require 'concurrent/executor/fixed_thread_pool'
|
279
|
+
```
|
278
280
|
|
279
281
|
To use the tools in the Edge gem it must be required separately:
|
280
282
|
|
@@ -362,20 +364,18 @@ best practice is to depend on `concurrent-ruby` and let users to decide if they
|
|
362
364
|
|
363
365
|
* Update `version.rb`
|
364
366
|
* Update the CHANGELOG
|
365
|
-
*
|
366
|
-
- Add the new version to `docs-source/signpost.md`. Needs to be done only if there are visible changes in the
|
367
|
-
documentation.
|
368
|
-
- Run `bundle exec rake yard` to update the master documentation and signpost.
|
369
|
-
- Run `bundle exec rake yard:<new-version>` to add or update the documentation of the new version.
|
367
|
+
* Add the new version to `docs-source/signpost.md`. Needs to be done only if there are visible changes in the documentation.
|
370
368
|
* Commit (and push) the changes.
|
371
|
-
* Use `
|
372
|
-
of `['release:checks', 'release:build', 'release:test', 'release:publish']` steps.
|
373
|
-
publishing anything. Steps can also be executed individually.
|
369
|
+
* Use `bundle exec rake release` to release the gem.
|
370
|
+
It consists of `['release:checks', 'release:build', 'release:test', 'release:publish']` steps.
|
371
|
+
It will ask at the end before publishing anything. Steps can also be executed individually.
|
374
372
|
|
375
373
|
## Maintainers
|
376
374
|
|
377
|
-
* [
|
378
|
-
* [
|
375
|
+
* [Benoit Daloze](https://github.com/eregon)
|
376
|
+
* [Matthew Draper](https://github.com/matthewd)
|
377
|
+
* [Rafael França](https://github.com/rafaelfranca)
|
378
|
+
* [Samuel Williams](https://github.com/ioquatix)
|
379
379
|
|
380
380
|
### Special Thanks to
|
381
381
|
|
@@ -386,6 +386,7 @@ best practice is to depend on `concurrent-ruby` and let users to decide if they
|
|
386
386
|
|
387
387
|
to the past maintainers
|
388
388
|
|
389
|
+
* [Chris Seaton](https://github.com/chrisseaton)
|
389
390
|
* [Petr Chalupa](https://github.com/pitr-ch)
|
390
391
|
* [Michele Della Torre](https://github.com/mighe)
|
391
392
|
* [Paweł Obrok](https://github.com/obrok)
|
data/Rakefile
CHANGED
@@ -34,14 +34,20 @@ namespace :repackage do
|
|
34
34
|
task :all do
|
35
35
|
Dir.chdir(__dir__) do
|
36
36
|
# store gems in vendor cache for docker
|
37
|
-
|
37
|
+
Bundler.with_original_env do
|
38
|
+
sh 'bundle package'
|
39
|
+
end
|
38
40
|
|
39
41
|
# build only the jar file not the whole gem for java platform, the jar is part the concurrent-ruby-x.y.z.gem
|
40
42
|
Rake::Task['lib/concurrent-ruby/concurrent/concurrent_ruby.jar'].invoke
|
41
43
|
|
42
44
|
# build all gem files
|
43
45
|
%w[x86-mingw32 x64-mingw32].each do |plat|
|
44
|
-
RakeCompilerDock.sh
|
46
|
+
RakeCompilerDock.sh(
|
47
|
+
"bundle install --local && bundle exec rake native:#{plat} gem --trace",
|
48
|
+
platform: plat,
|
49
|
+
options: ['--privileged'], # otherwise the directory in the image is empty
|
50
|
+
runas: false)
|
45
51
|
end
|
46
52
|
end
|
47
53
|
end
|
@@ -54,7 +60,10 @@ Gem::PackageTask.new(core_gemspec) {} if core_gemspec
|
|
54
60
|
Gem::PackageTask.new(ext_gemspec) {} if ext_gemspec && !Concurrent.on_jruby?
|
55
61
|
Gem::PackageTask.new(edge_gemspec) {} if edge_gemspec
|
56
62
|
|
57
|
-
CLEAN.include(
|
63
|
+
CLEAN.include(
|
64
|
+
'lib/concurrent-ruby/concurrent/concurrent_ruby_ext.*',
|
65
|
+
'lib/concurrent-ruby/concurrent/2.*',
|
66
|
+
'lib/concurrent-ruby/concurrent/*.jar')
|
58
67
|
|
59
68
|
begin
|
60
69
|
require 'rspec'
|
@@ -74,13 +83,15 @@ begin
|
|
74
83
|
|
75
84
|
desc '* test packaged and installed gems instead of local files'
|
76
85
|
task :installed do
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
86
|
+
Bundler.with_original_env do
|
87
|
+
Dir.chdir(__dir__) do
|
88
|
+
sh "gem install pkg/concurrent-ruby-#{Concurrent::VERSION}.gem"
|
89
|
+
sh "gem install pkg/concurrent-ruby-ext-#{Concurrent::VERSION}.gem" if Concurrent.on_cruby?
|
90
|
+
sh "gem install pkg/concurrent-ruby-edge-#{Concurrent::EDGE_VERSION}.gem"
|
91
|
+
ENV['NO_PATH'] = 'true'
|
92
|
+
sh 'bundle update'
|
93
|
+
sh 'bundle exec rake spec:ci'
|
94
|
+
end
|
84
95
|
end
|
85
96
|
end
|
86
97
|
end
|
@@ -88,6 +99,19 @@ begin
|
|
88
99
|
desc 'executed in CI'
|
89
100
|
task :ci => [:compile, 'spec:ci']
|
90
101
|
|
102
|
+
desc 'run each spec file in a separate process to help find missing requires'
|
103
|
+
task 'spec:isolated' do
|
104
|
+
glob = "#{ENV['DIR'] || 'spec'}/**/*_spec.rb"
|
105
|
+
from = ENV['FROM']
|
106
|
+
env = { 'ISOLATED' => 'true' }
|
107
|
+
Dir[glob].each do |spec|
|
108
|
+
next if from and from != spec
|
109
|
+
from = nil if from == spec
|
110
|
+
|
111
|
+
sh env, 'rspec', spec
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
91
115
|
task :default => [:clobber, :compile, :spec]
|
92
116
|
rescue LoadError => e
|
93
117
|
puts 'RSpec is not installed, skipping test task definitions: ' + e.message
|
@@ -184,34 +208,6 @@ begin
|
|
184
208
|
*common_yard_options)
|
185
209
|
yard.files = ['no-lib']
|
186
210
|
end
|
187
|
-
|
188
|
-
define_uptodate_task = -> name do
|
189
|
-
namespace name do
|
190
|
-
desc "** ensure that #{name} generated documentation is matching the source code"
|
191
|
-
task :uptodate do
|
192
|
-
Dir.chdir(__dir__) do
|
193
|
-
begin
|
194
|
-
FileUtils.cp_r 'docs', 'docs-copy', verbose: true
|
195
|
-
Rake::Task["yard:#{name}"].invoke
|
196
|
-
sh 'diff -r docs/ docs-copy/' do |ok, res|
|
197
|
-
unless ok
|
198
|
-
begin
|
199
|
-
STDOUT.puts "yard:#{name} is not properly generated and committed.", "Continue? (y/n)"
|
200
|
-
input = STDIN.gets.strip.downcase
|
201
|
-
end until %w(y n).include?(input)
|
202
|
-
exit 1 if input == 'n'
|
203
|
-
end
|
204
|
-
end
|
205
|
-
ensure
|
206
|
-
FileUtils.rm_rf 'docs-copy', verbose: true
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
define_uptodate_task.call current_yard_version_name
|
214
|
-
define_uptodate_task.call 'master'
|
215
211
|
end
|
216
212
|
|
217
213
|
rescue LoadError => e
|
@@ -224,7 +220,7 @@ task :release => ['release:checks', 'release:build', 'release:test', 'release:pu
|
|
224
220
|
namespace :release do
|
225
221
|
# Depends on environment of @pitr-ch
|
226
222
|
|
227
|
-
task :checks
|
223
|
+
task :checks do
|
228
224
|
Dir.chdir(__dir__) do
|
229
225
|
sh 'test -z "$(git status --porcelain)"' do |ok, res|
|
230
226
|
unless ok
|
@@ -256,25 +252,18 @@ namespace :release do
|
|
256
252
|
desc '* test actual installed gems instead of cloned repository on MRI and JRuby'
|
257
253
|
task :test do
|
258
254
|
Dir.chdir(__dir__) do
|
259
|
-
|
255
|
+
puts "Testing with the installed gem"
|
260
256
|
|
261
|
-
|
262
|
-
|
257
|
+
Bundler.with_original_env do
|
258
|
+
sh 'ruby -v'
|
259
|
+
sh 'bundle exec rake spec:installed'
|
263
260
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
sh 'rbenv version'
|
269
|
-
sh 'bundle exec rake spec:installed'
|
270
|
-
|
271
|
-
ENV['RBENV_VERSION'] = jruby_version
|
272
|
-
sh 'rbenv version'
|
273
|
-
sh 'bundle exec rake spec:installed'
|
261
|
+
env = { "PATH" => "#{ENV['CONCURRENT_JRUBY_HOME']}/bin:#{ENV['PATH']}" }
|
262
|
+
sh env, 'ruby -v'
|
263
|
+
sh env, 'bundle exec rake spec:installed'
|
264
|
+
end
|
274
265
|
|
275
266
|
puts 'Windows build is untested'
|
276
|
-
|
277
|
-
ENV['RBENV_VERSION'] = old
|
278
267
|
end
|
279
268
|
end
|
280
269
|
|
@@ -321,9 +310,9 @@ namespace :release do
|
|
321
310
|
desc '** print post release steps'
|
322
311
|
task :post_steps do
|
323
312
|
# TODO: (petr 05-Jun-2021) automate and renew the process
|
324
|
-
|
325
|
-
|
326
|
-
|
313
|
+
puts 'Manually: create a release on GitHub with relevant changelog part'
|
314
|
+
puts 'Manually: send email same as release with relevant changelog part'
|
315
|
+
puts 'Manually: tweet'
|
327
316
|
end
|
328
317
|
end
|
329
318
|
end
|
@@ -55,12 +55,6 @@ public class SynchronizationLibrary implements Library {
|
|
55
55
|
}
|
56
56
|
}
|
57
57
|
|
58
|
-
private static final ObjectAllocator JRUBY_OBJECT_ALLOCATOR = new ObjectAllocator() {
|
59
|
-
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
60
|
-
return new JRubyObject(runtime, klazz);
|
61
|
-
}
|
62
|
-
};
|
63
|
-
|
64
58
|
private static final ObjectAllocator OBJECT_ALLOCATOR = new ObjectAllocator() {
|
65
59
|
public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
|
66
60
|
return new Object(runtime, klazz);
|
@@ -87,10 +81,7 @@ public class SynchronizationLibrary implements Library {
|
|
87
81
|
RubyModule jrubyAttrVolatileModule = synchronizationModule.defineModuleUnder("JRubyAttrVolatile");
|
88
82
|
jrubyAttrVolatileModule.defineAnnotatedMethods(JRubyAttrVolatile.class);
|
89
83
|
|
90
|
-
defineClass(runtime, synchronizationModule, "AbstractObject", "
|
91
|
-
JRubyObject.class, JRUBY_OBJECT_ALLOCATOR);
|
92
|
-
|
93
|
-
defineClass(runtime, synchronizationModule, "JRubyObject", "Object",
|
84
|
+
defineClass(runtime, synchronizationModule, "AbstractObject", "Object",
|
94
85
|
Object.class, OBJECT_ALLOCATOR);
|
95
86
|
|
96
87
|
defineClass(runtime, synchronizationModule, "Object", "AbstractLockableObject",
|
@@ -143,8 +134,8 @@ public class SynchronizationLibrary implements Library {
|
|
143
134
|
// attempt to avoid code elimination.
|
144
135
|
private static volatile int volatileField;
|
145
136
|
|
146
|
-
@JRubyMethod(name = "full_memory_barrier", visibility = Visibility.PUBLIC)
|
147
|
-
public static IRubyObject fullMemoryBarrier(ThreadContext context, IRubyObject
|
137
|
+
@JRubyMethod(name = "full_memory_barrier", visibility = Visibility.PUBLIC, module = true)
|
138
|
+
public static IRubyObject fullMemoryBarrier(ThreadContext context, IRubyObject module) {
|
148
139
|
// Prevent reordering of ivar writes with publication of this instance
|
149
140
|
if (!FULL_FENCE) {
|
150
141
|
// Assuming that following volatile read and write is not eliminated it simulates fullFence.
|
@@ -158,9 +149,10 @@ public class SynchronizationLibrary implements Library {
|
|
158
149
|
return context.nil;
|
159
150
|
}
|
160
151
|
|
161
|
-
@JRubyMethod(name = "instance_variable_get_volatile", visibility = Visibility.PUBLIC)
|
152
|
+
@JRubyMethod(name = "instance_variable_get_volatile", visibility = Visibility.PUBLIC, module = true)
|
162
153
|
public static IRubyObject instanceVariableGetVolatile(
|
163
154
|
ThreadContext context,
|
155
|
+
IRubyObject module,
|
164
156
|
IRubyObject self,
|
165
157
|
IRubyObject name) {
|
166
158
|
// Ensure we ses latest value with loadFence
|
@@ -174,9 +166,10 @@ public class SynchronizationLibrary implements Library {
|
|
174
166
|
}
|
175
167
|
}
|
176
168
|
|
177
|
-
@JRubyMethod(name = "instance_variable_set_volatile", visibility = Visibility.PUBLIC)
|
169
|
+
@JRubyMethod(name = "instance_variable_set_volatile", visibility = Visibility.PUBLIC, module = true)
|
178
170
|
public static IRubyObject InstanceVariableSetVolatile(
|
179
171
|
ThreadContext context,
|
172
|
+
IRubyObject module,
|
180
173
|
IRubyObject self,
|
181
174
|
IRubyObject name,
|
182
175
|
IRubyObject value) {
|
@@ -195,16 +188,8 @@ public class SynchronizationLibrary implements Library {
|
|
195
188
|
}
|
196
189
|
}
|
197
190
|
|
198
|
-
@JRubyClass(name = "
|
199
|
-
public static class
|
200
|
-
|
201
|
-
public JRubyObject(Ruby runtime, RubyClass metaClass) {
|
202
|
-
super(runtime, metaClass);
|
203
|
-
}
|
204
|
-
}
|
205
|
-
|
206
|
-
@JRubyClass(name = "Object", parent = "JRubyObject")
|
207
|
-
public static class Object extends JRubyObject {
|
191
|
+
@JRubyClass(name = "Object", parent = "AbstractObject")
|
192
|
+
public static class Object extends RubyObject {
|
208
193
|
|
209
194
|
public Object(Ruby runtime, RubyClass metaClass) {
|
210
195
|
super(runtime, metaClass);
|
@@ -220,7 +205,7 @@ public class SynchronizationLibrary implements Library {
|
|
220
205
|
}
|
221
206
|
|
222
207
|
@JRubyClass(name = "JRubyLockableObject", parent = "AbstractLockableObject")
|
223
|
-
public static class JRubyLockableObject extends
|
208
|
+
public static class JRubyLockableObject extends AbstractLockableObject {
|
224
209
|
|
225
210
|
public JRubyLockableObject(Ruby runtime, RubyClass metaClass) {
|
226
211
|
super(runtime, metaClass);
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'concurrent/configuration'
|
2
2
|
require 'concurrent/atomic/atomic_reference'
|
3
|
+
require 'concurrent/atomic/count_down_latch'
|
3
4
|
require 'concurrent/atomic/thread_local_var'
|
4
5
|
require 'concurrent/collection/copy_on_write_observer_set'
|
5
6
|
require 'concurrent/concern/observable'
|
6
|
-
require 'concurrent/synchronization'
|
7
|
+
require 'concurrent/synchronization/lockable_object'
|
7
8
|
|
8
9
|
module Concurrent
|
9
10
|
|
@@ -34,16 +34,6 @@ module Concurrent
|
|
34
34
|
end
|
35
35
|
JRubyArray
|
36
36
|
|
37
|
-
when Concurrent.on_rbx?
|
38
|
-
require 'monitor'
|
39
|
-
require 'concurrent/thread_safe/util/data_structures'
|
40
|
-
|
41
|
-
class RbxArray < ::Array
|
42
|
-
end
|
43
|
-
|
44
|
-
ThreadSafe::Util.make_synchronized_on_rbx RbxArray
|
45
|
-
RbxArray
|
46
|
-
|
47
37
|
when Concurrent.on_truffleruby?
|
48
38
|
require 'concurrent/thread_safe/util/data_structures'
|
49
39
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'concurrent/atomic/atomic_reference'
|
2
2
|
require 'concurrent/collection/copy_on_notify_observer_set'
|
3
3
|
require 'concurrent/concern/observable'
|
4
|
-
require 'concurrent/synchronization'
|
4
|
+
require 'concurrent/synchronization/object'
|
5
5
|
|
6
6
|
# @!macro thread_safe_variable_comparison
|
7
7
|
#
|
@@ -1,5 +1,6 @@
|
|
1
|
+
require 'concurrent/utility/native_extension_loader' # load native parts first
|
2
|
+
|
1
3
|
require 'concurrent/atomic/mutex_atomic_boolean'
|
2
|
-
require 'concurrent/synchronization'
|
3
4
|
|
4
5
|
module Concurrent
|
5
6
|
|
@@ -79,10 +80,10 @@ module Concurrent
|
|
79
80
|
# @!visibility private
|
80
81
|
# @!macro internal_implementation_note
|
81
82
|
AtomicBooleanImplementation = case
|
82
|
-
when
|
83
|
-
JavaAtomicBoolean
|
84
|
-
when defined?(CAtomicBoolean)
|
83
|
+
when Concurrent.on_cruby? && Concurrent.c_extensions_loaded?
|
85
84
|
CAtomicBoolean
|
85
|
+
when Concurrent.on_jruby?
|
86
|
+
JavaAtomicBoolean
|
86
87
|
else
|
87
88
|
MutexAtomicBoolean
|
88
89
|
end
|
@@ -1,5 +1,6 @@
|
|
1
|
+
require 'concurrent/utility/native_extension_loader' # load native parts first
|
2
|
+
|
1
3
|
require 'concurrent/atomic/mutex_atomic_fixnum'
|
2
|
-
require 'concurrent/synchronization'
|
3
4
|
|
4
5
|
module Concurrent
|
5
6
|
|
@@ -96,10 +97,10 @@ module Concurrent
|
|
96
97
|
# @!visibility private
|
97
98
|
# @!macro internal_implementation_note
|
98
99
|
AtomicFixnumImplementation = case
|
99
|
-
when
|
100
|
-
JavaAtomicFixnum
|
101
|
-
when defined?(CAtomicFixnum)
|
100
|
+
when Concurrent.on_cruby? && Concurrent.c_extensions_loaded?
|
102
101
|
CAtomicFixnum
|
102
|
+
when Concurrent.on_jruby?
|
103
|
+
JavaAtomicFixnum
|
103
104
|
else
|
104
105
|
MutexAtomicFixnum
|
105
106
|
end
|