concurrent-ruby 0.7.2-java → 0.8.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +9 -2
- data/README.md +90 -40
- data/lib/concurrent/atomic.rb +2 -1
- data/lib/concurrent/atomic/atomic_boolean.rb +1 -2
- data/lib/concurrent/atomic/atomic_fixnum.rb +1 -2
- data/lib/concurrent/atomic_reference/jruby.rb +0 -1
- data/lib/concurrent/atomic_reference/ruby.rb +20 -28
- data/lib/concurrent/future.rb +7 -6
- data/lib/concurrent/options_parser.rb +4 -0
- data/lib/concurrent/promise.rb +35 -16
- data/lib/concurrent/version.rb +1 -1
- data/lib/concurrent_ruby_ext.jar +0 -0
- data/lib/extension_helper.rb +25 -16
- metadata +49 -55
- data/lib/concurrent_ruby_ext.so +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a22905c0d896596f7b3247122687f19e6f6967eb
|
4
|
+
data.tar.gz: 0c7b8b282b51f1a71c37df90da8eeb3aa7b614a9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 63abed1c068d3c25930a6a60637d4ad5dc40121f091440850ab03214a7cf8e13fee800fc258a0ce93482462134728884081f88a013656778a8344255f8ceb048
|
7
|
+
data.tar.gz: 05670a25a6e3e6cd9c091e4b50ff13f506723383abb5e263039b4e90c01b2a392d2b2651179ae90f39f55b6e4b1538e65a5ffa606385e9c7d9491e627e9a5c63
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
### Next Release v0.
|
1
|
+
### Next Release v0.8.0 (25 January 2015)
|
2
|
+
|
3
|
+
* C extension for MRI have been extracted into the `concurrent-ruby-ext` companion gem.
|
4
|
+
Please see the README for more detail.
|
5
|
+
* Better variable isolation in `Promise` and `Future` via an `:args` option
|
6
|
+
* Continued to update intermittently failing tests
|
7
|
+
|
8
|
+
## Current Release v0.7.2 (24 January 2015)
|
2
9
|
|
3
10
|
* New `Semaphore` class based on [java.util.concurrent.Semaphore](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html)
|
4
11
|
* New `Promise.all?` and `Promise.any?` class methods
|
@@ -15,7 +22,7 @@
|
|
15
22
|
* Tests now run on new Travis build environment
|
16
23
|
* Multiple documentation updates
|
17
24
|
|
18
|
-
|
25
|
+
### Release v0.7.1 (4 December 2014)
|
19
26
|
|
20
27
|
Please see the [roadmap](https://github.com/ruby-concurrency/concurrent-ruby/issues/142) for more information on the next planned release.
|
21
28
|
|
data/README.md
CHANGED
@@ -37,10 +37,8 @@
|
|
37
37
|
|
38
38
|
### Supported Ruby versions
|
39
39
|
|
40
|
-
MRI 1.9.3, 2.0, 2.1, JRuby (1.9 mode), and Rubinius 2.x are supported.
|
41
|
-
|
42
|
-
is available in pure Ruby. This gem should be fully compatible with any interpreter that is
|
43
|
-
compliant with Ruby 1.9.3 or newer.
|
40
|
+
MRI 1.9.3, 2.0, 2.1, 2.2, JRuby (1.9 mode), and Rubinius 2.x are supported.
|
41
|
+
This gem should be fully compatible with any interpreter that is compliant with Ruby 1.9.3 or newer.
|
44
42
|
|
45
43
|
## Features & Documentation
|
46
44
|
|
@@ -62,6 +60,7 @@ This library contains a variety of concurrency abstractions at high and low leve
|
|
62
60
|
* [Promise](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Promise.html): Similar to Futures, with more features.
|
63
61
|
* [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ScheduledTask.html): Like a Future scheduled for a specific future time.
|
64
62
|
* [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TimerTask.html): A Thread that periodically wakes up to perform work at regular intervals.
|
63
|
+
* [Channel](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Channel.html): Communicating Sequential Processes (CSP).
|
65
64
|
|
66
65
|
### Java-inspired ThreadPools and other executors
|
67
66
|
|
@@ -98,28 +97,45 @@ Lower-level abstractions mainly used as building blocks.
|
|
98
97
|
* [thread-local variables](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/ThreadLocalVar.html)
|
99
98
|
* [software transactional memory](http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/TVar.html) (TVar)
|
100
99
|
|
101
|
-
##
|
100
|
+
## Usage
|
102
101
|
|
103
|
-
|
104
|
-
compilation errors, we provide pre-compiled gem packages for several platforms as well
|
105
|
-
as a pure-Ruby build. Installing the gem should be no different than installing any other
|
106
|
-
Rubygems-hosted gem. Rubygems will automatically detect your platform and install the
|
107
|
-
appropriate pre-compiled build. You should never see Rubygems attempt to compile the gem
|
108
|
-
on installation. Additionally, to ensure compatability with the largest possible number
|
109
|
-
of Ruby interpreters, the C extensions will *never* load under any Ruby other than MRI,
|
110
|
-
even when installed.
|
102
|
+
All abstractions within this gem can be loaded simply by requiring it:
|
111
103
|
|
112
|
-
|
104
|
+
```ruby
|
105
|
+
require 'concurrent'
|
106
|
+
```
|
107
|
+
|
108
|
+
To reduce the amount of code loaded at runtime, subsets of this gem can be required:
|
113
109
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
110
|
+
```ruby
|
111
|
+
require 'concurrent' # everything
|
112
|
+
|
113
|
+
# groups
|
114
|
+
|
115
|
+
require 'concurrent/actor' # Concurrent::Actor and supporting code
|
116
|
+
require 'concurrent/atomics' # atomic and thread synchronization classes
|
117
|
+
require 'concurrent/channels' # Concurrent::Channel and supporting code
|
118
|
+
require 'concurrent/executors' # Thread pools and other executors
|
119
|
+
require 'concurrent/utilities' # utility methods such as processor count and timers
|
120
|
+
|
121
|
+
# individual abstractions
|
122
|
+
|
123
|
+
require 'concurrent/agent' # Concurrent::Agent
|
124
|
+
require 'concurrent/async' # Concurrent::Async
|
125
|
+
require 'concurrent/atomic' # Concurrent::Atomic (formerly the `atomic` gem)
|
126
|
+
require 'concurrent/dataflow' # Concurrent::dataflow
|
127
|
+
require 'concurrent/delay' # Concurrent::Delay
|
128
|
+
require 'concurrent/exchanger' # Concurrent::Exchanger
|
129
|
+
require 'concurrent/future' # Concurrent::Future
|
130
|
+
require 'concurrent/ivar' # Concurrent::IVar
|
131
|
+
require 'concurrent/mvar' # Concurrent::MVar
|
132
|
+
require 'concurrent/promise' # Concurrent::Promise
|
133
|
+
require 'concurrent/scheduled_task' # Concurrent::ScheduledTask
|
134
|
+
require 'concurrent/timer_task' # Concurrent::TimerTask
|
135
|
+
require 'concurrent/tvar' # Concurrent::TVar
|
136
|
+
```
|
121
137
|
|
122
|
-
|
138
|
+
## Installation
|
123
139
|
|
124
140
|
```shell
|
125
141
|
gem install concurrent-ruby
|
@@ -133,31 +149,64 @@ gem 'concurrent-ruby'
|
|
133
149
|
|
134
150
|
and run `bundle install` from your shell.
|
135
151
|
|
136
|
-
###
|
152
|
+
### C Extensions for MRI
|
137
153
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
154
|
+
Potential performance improvements may be achieved under MRI by installing optional C extensions.
|
155
|
+
To minimize installation errors the C extensions are available in the `concurrent-ruby-ext` extension
|
156
|
+
gem. The extension gem lists `concurrent-ruby` as a dependency so it is not necessary to install both.
|
157
|
+
Simply install the extension gen:
|
142
158
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
even when using the native optimizations. Please see the [documentation](http://ruby-concurrency.github.io/concurrent-ruby/)
|
147
|
-
for more details.
|
159
|
+
```ruby
|
160
|
+
gem install concurrent-ruby-ext
|
161
|
+
```
|
148
162
|
|
149
|
-
|
163
|
+
or add the following line to Gemfile:
|
150
164
|
|
151
|
-
```
|
152
|
-
|
153
|
-
|
165
|
+
```ruby
|
166
|
+
gem 'concurrent-ruby-ext'
|
167
|
+
```
|
168
|
+
|
169
|
+
and run `bundle install` from your shell.
|
170
|
+
|
171
|
+
In code it is only necessary to
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
require 'concurrent'
|
154
175
|
```
|
155
176
|
|
156
|
-
|
157
|
-
|
177
|
+
The `concurrent-ruby` gem will automatically detect the presence of the `concurrent-ruby-ext` gem
|
178
|
+
and load the appropriate C extensions.
|
158
179
|
|
159
|
-
|
160
|
-
|
180
|
+
#### Note For gem developers
|
181
|
+
|
182
|
+
No gems should depend on `concurrent-ruby-ext`. Doing so will force C extensions on your users.
|
183
|
+
The best practice is to depend on `concurrent-ruby` and let users to decide if they want C extensions.
|
184
|
+
|
185
|
+
### Building
|
186
|
+
|
187
|
+
All published versions of this gem (core, extension, and several platform-specific packages) are compiled,
|
188
|
+
packaged, tested, and published using an open, [automated process](https://github.com/ruby-concurrency/rake-compiler-dev-box).
|
189
|
+
This process can also be used to create pre-compiled binaries of the extension gem for virtally
|
190
|
+
any platform. *Documentation is forthcoming...*
|
191
|
+
|
192
|
+
```
|
193
|
+
*MRI only*
|
194
|
+
rake build:native # Build concurrent-ruby-ext-<version>-<platform>.gem into the pkg directory
|
195
|
+
rake compile:extension # Compile extension
|
196
|
+
|
197
|
+
*JRuby only*
|
198
|
+
rake build # Build JRuby-specific core gem (alias for `build:core`)
|
199
|
+
rake build:core # Build concurrent-ruby-<version>-java.gem into the pkg directory
|
200
|
+
|
201
|
+
*All except JRuby*
|
202
|
+
rake build # Build core and extension gems
|
203
|
+
rake build:core # Build concurrent-ruby-<version>.gem into the pkg directory
|
204
|
+
rake build:ext # Build concurrent-ruby-ext-<version>.gem into the pkg directory
|
205
|
+
|
206
|
+
*All*
|
207
|
+
rake clean # Remove any temporary products
|
208
|
+
rake clobber # Remove any generated file
|
209
|
+
rake compile # Compile all the extensions
|
161
210
|
```
|
162
211
|
|
163
212
|
## Maintainers
|
@@ -167,6 +216,7 @@ BUILD_PURE_RUBY='true' bundle exec rake build
|
|
167
216
|
* [Chris Seaton](https://github.com/chrisseaton)
|
168
217
|
* [Lucas Allan](https://github.com/lucasallan)
|
169
218
|
* [Petr Chalupa](https://github.com/pitr-ch)
|
219
|
+
* [Paweł Obrok](https://github.com/obrok)
|
170
220
|
|
171
221
|
### Contributing
|
172
222
|
|
data/lib/concurrent/atomic.rb
CHANGED
@@ -12,6 +12,7 @@ RUBY
|
|
12
12
|
end
|
13
13
|
#####################################################################
|
14
14
|
|
15
|
+
require_relative '../extension_helper'
|
15
16
|
require 'concurrent/atomic_reference/concurrent_update_error'
|
16
17
|
require 'concurrent/atomic_reference/mutex_atomic'
|
17
18
|
|
@@ -77,7 +78,7 @@ elsif defined? Concurrent::RbxAtomic
|
|
77
78
|
class Concurrent::Atomic < Concurrent::RbxAtomic
|
78
79
|
end
|
79
80
|
|
80
|
-
elsif Concurrent
|
81
|
+
elsif defined? Concurrent::CAtomic
|
81
82
|
|
82
83
|
# @!macro atomic_reference
|
83
84
|
class Concurrent::Atomic < Concurrent::CAtomic
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require_relative '../../extension_helper'
|
2
|
-
Concurrent.safe_require_c_extensions
|
3
2
|
|
4
3
|
module Concurrent
|
5
4
|
|
@@ -162,7 +161,7 @@ module Concurrent
|
|
162
161
|
class AtomicBoolean < JavaAtomicBoolean
|
163
162
|
end
|
164
163
|
|
165
|
-
elsif
|
164
|
+
elsif defined?(CAtomicBoolean)
|
166
165
|
|
167
166
|
# @!macro atomic_boolean
|
168
167
|
class CAtomicBoolean
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require_relative '../../extension_helper'
|
2
|
-
Concurrent.safe_require_c_extensions
|
3
2
|
|
4
3
|
module Concurrent
|
5
4
|
|
@@ -166,7 +165,7 @@ module Concurrent
|
|
166
165
|
class AtomicFixnum < JavaAtomicFixnum
|
167
166
|
end
|
168
167
|
|
169
|
-
elsif
|
168
|
+
elsif defined?(CAtomicFixnum)
|
170
169
|
|
171
170
|
# @!macro atomic_fixnum
|
172
171
|
class CAtomicFixnum
|
@@ -1,37 +1,29 @@
|
|
1
|
-
|
1
|
+
if defined? Concurrent::CAtomic
|
2
|
+
require_relative '../../extension_helper'
|
3
|
+
require 'concurrent/atomic_reference/direct_update'
|
4
|
+
require 'concurrent/atomic_reference/numeric_cas_wrapper'
|
2
5
|
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'concurrent_ruby_ext'
|
6
|
-
rescue LoadError
|
7
|
-
# may be a Windows cross-compiled native gem
|
8
|
-
require "#{RUBY_VERSION[0..2]}/concurrent_ruby_ext"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
require 'concurrent/atomic_reference/direct_update'
|
13
|
-
require 'concurrent/atomic_reference/numeric_cas_wrapper'
|
14
|
-
|
15
|
-
module Concurrent
|
6
|
+
module Concurrent
|
16
7
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
8
|
+
# @!macro atomic_reference
|
9
|
+
class CAtomic
|
10
|
+
include Concurrent::AtomicDirectUpdate
|
11
|
+
include Concurrent::AtomicNumericCompareAndSetWrapper
|
21
12
|
|
22
|
-
|
23
|
-
|
13
|
+
# @!method initialize
|
14
|
+
# @!macro atomic_reference_method_initialize
|
24
15
|
|
25
|
-
|
26
|
-
|
16
|
+
# @!method get
|
17
|
+
# @!macro atomic_reference_method_get
|
27
18
|
|
28
|
-
|
29
|
-
|
19
|
+
# @!method set
|
20
|
+
# @!macro atomic_reference_method_set
|
30
21
|
|
31
|
-
|
32
|
-
|
22
|
+
# @!method get_and_set
|
23
|
+
# @!macro atomic_reference_method_get_and_set
|
33
24
|
|
34
|
-
|
35
|
-
|
25
|
+
# @!method _compare_and_set
|
26
|
+
# @!macro atomic_reference_method_compare_and_set
|
27
|
+
end
|
36
28
|
end
|
37
29
|
end
|
data/lib/concurrent/future.rb
CHANGED
@@ -23,6 +23,8 @@ module Concurrent
|
|
23
23
|
# global task pool (for short-running tasks)
|
24
24
|
# @option opts [object] :executor when provided will run all operations on
|
25
25
|
# this executor rather than the global thread pool (overrides :operation)
|
26
|
+
# @option opts [object, Array] :args zero or more arguments to be passed the task block on execution
|
27
|
+
#
|
26
28
|
# @option opts [String] :dup_on_deref (false) call `#dup` before returning the data
|
27
29
|
# @option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data
|
28
30
|
# @option opts [String] :copy_on_deref (nil) call the given `Proc` passing the internal value and
|
@@ -35,6 +37,7 @@ module Concurrent
|
|
35
37
|
@state = :unscheduled
|
36
38
|
@task = block
|
37
39
|
@executor = OptionsParser::get_executor_from(opts) || Concurrent.configuration.global_operation_pool
|
40
|
+
@args = OptionsParser::get_arguments_from(opts)
|
38
41
|
end
|
39
42
|
|
40
43
|
# Execute an `:unscheduled` `Future`. Immediately sets the state to `:pending` and
|
@@ -52,11 +55,9 @@ module Concurrent
|
|
52
55
|
# @example Instance and execute in one line
|
53
56
|
# future = Concurrent::Future.new{ sleep(1); 42 }.execute
|
54
57
|
# future.state #=> :pending
|
55
|
-
#
|
56
|
-
# @since 0.5.0
|
57
58
|
def execute
|
58
59
|
if compare_and_set_state(:pending, :unscheduled)
|
59
|
-
@executor.post{ work }
|
60
|
+
@executor.post(@args){ work }
|
60
61
|
self
|
61
62
|
end
|
62
63
|
end
|
@@ -72,6 +73,8 @@ module Concurrent
|
|
72
73
|
# global task pool (for short-running tasks)
|
73
74
|
# @option opts [object] :executor when provided will run all operations on
|
74
75
|
# this executor rather than the global thread pool (overrides :operation)
|
76
|
+
# @option opts [object, Array] :args zero or more arguments to be passed the task block on execution
|
77
|
+
#
|
75
78
|
# @option opts [String] :dup_on_deref (false) call `#dup` before returning the data
|
76
79
|
# @option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data
|
77
80
|
# @option opts [String] :copy_on_deref (nil) call the given `Proc` passing the internal value and
|
@@ -84,8 +87,6 @@ module Concurrent
|
|
84
87
|
# @example
|
85
88
|
# future = Concurrent::Future.execute{ sleep(1); 42 }
|
86
89
|
# future.state #=> :pending
|
87
|
-
#
|
88
|
-
# @since 0.5.0
|
89
90
|
def self.execute(opts = {}, &block)
|
90
91
|
Future.new(opts, &block).execute
|
91
92
|
end
|
@@ -96,7 +97,7 @@ module Concurrent
|
|
96
97
|
|
97
98
|
# @!visibility private
|
98
99
|
def work # :nodoc:
|
99
|
-
success, val, reason = SafeTaskExecutor.new(@task).execute
|
100
|
+
success, val, reason = SafeTaskExecutor.new(@task).execute(*@args)
|
100
101
|
complete(success, val, reason)
|
101
102
|
end
|
102
103
|
end
|
@@ -23,6 +23,10 @@ module Concurrent
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def get_arguments_from(opts = {})
|
27
|
+
[*opts.fetch(:args, [])]
|
28
|
+
end
|
29
|
+
|
26
30
|
# Get the requested `Executor` based on the values set in the options hash.
|
27
31
|
#
|
28
32
|
# @param [Hash] opts the options defining the requested executor
|
data/lib/concurrent/promise.rb
CHANGED
@@ -172,22 +172,25 @@ module Concurrent
|
|
172
172
|
|
173
173
|
# Initialize a new Promise with the provided options.
|
174
174
|
#
|
175
|
-
#
|
175
|
+
# @!macro [attach] promise_init_options
|
176
176
|
#
|
177
|
-
#
|
178
|
-
# @option opts [Proc] :on_fulfill fulfillment handler
|
179
|
-
# @option opts [Proc] :on_reject rejection handler
|
177
|
+
# @param [Hash] opts the options used to define the behavior at update and deref
|
180
178
|
#
|
181
|
-
#
|
182
|
-
#
|
183
|
-
#
|
184
|
-
# @option opts [object] :executor when provided will run all operations on
|
185
|
-
# this executor rather than the global thread pool (overrides :operation)
|
179
|
+
# @option opts [Promise] :parent the parent `Promise` when building a chain/tree
|
180
|
+
# @option opts [Proc] :on_fulfill fulfillment handler
|
181
|
+
# @option opts [Proc] :on_reject rejection handler
|
186
182
|
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
183
|
+
# @option opts [Boolean] :operation (false) when `true` will execute the future on the global
|
184
|
+
# operation pool (for long-running operations), when `false` will execute the future on the
|
185
|
+
# global task pool (for short-running tasks)
|
186
|
+
# @option opts [object] :executor when provided will run all operations on
|
187
|
+
# this executor rather than the global thread pool (overrides :operation)
|
188
|
+
# @option opts [object, Array] :args zero or more arguments to be passed the task block on execution
|
189
|
+
#
|
190
|
+
# @option opts [String] :dup_on_deref (false) call `#dup` before returning the data
|
191
|
+
# @option opts [String] :freeze_on_deref (false) call `#freeze` before returning the data
|
192
|
+
# @option opts [String] :copy_on_deref (nil) call the given `Proc` passing the internal value and
|
193
|
+
# returning the value returned from the proc
|
191
194
|
#
|
192
195
|
# @see http://wiki.commonjs.org/wiki/Promises/A
|
193
196
|
# @see http://promises-aplus.github.io/promises-spec/
|
@@ -195,6 +198,8 @@ module Concurrent
|
|
195
198
|
opts.delete_if { |k, v| v.nil? }
|
196
199
|
|
197
200
|
@executor = OptionsParser::get_executor_from(opts) || Concurrent.configuration.global_operation_pool
|
201
|
+
@args = OptionsParser::get_arguments_from(opts)
|
202
|
+
|
198
203
|
@parent = opts.fetch(:parent) { nil }
|
199
204
|
@on_fulfill = opts.fetch(:on_fulfill) { Proc.new { |result| result } }
|
200
205
|
@on_reject = opts.fetch(:on_reject) { Proc.new { |reason| raise reason } }
|
@@ -219,7 +224,6 @@ module Concurrent
|
|
219
224
|
end
|
220
225
|
|
221
226
|
# @return [Promise]
|
222
|
-
# @since 0.5.0
|
223
227
|
def execute
|
224
228
|
if root?
|
225
229
|
if compare_and_set_state(:pending, :unscheduled)
|
@@ -232,7 +236,18 @@ module Concurrent
|
|
232
236
|
self
|
233
237
|
end
|
234
238
|
|
235
|
-
#
|
239
|
+
# Create a new `Promise` object with the given block, execute it, and return the
|
240
|
+
# `:pending` object.
|
241
|
+
#
|
242
|
+
# @!macro promise_init_options
|
243
|
+
#
|
244
|
+
# @return [Promise] the newly created `Promise` in the `:pending` state
|
245
|
+
#
|
246
|
+
# @raise [ArgumentError] if no block is given
|
247
|
+
#
|
248
|
+
# @example
|
249
|
+
# promise = Concurrent::Promise.execute{ sleep(1); 42 }
|
250
|
+
# promise.state #=> :pending
|
236
251
|
def self.execute(opts = {}, &block)
|
237
252
|
new(opts, &block).execute
|
238
253
|
end
|
@@ -389,6 +404,7 @@ module Concurrent
|
|
389
404
|
composite
|
390
405
|
end
|
391
406
|
|
407
|
+
# @!visibility private
|
392
408
|
def set_pending
|
393
409
|
mutex.synchronize do
|
394
410
|
@state = :pending
|
@@ -413,6 +429,7 @@ module Concurrent
|
|
413
429
|
nil
|
414
430
|
end
|
415
431
|
|
432
|
+
# @!visibility private
|
416
433
|
def notify_child(child)
|
417
434
|
if_state(:fulfilled) { child.on_fulfill(apply_deref_options(@value)) }
|
418
435
|
if_state(:rejected) { child.on_reject(@reason) }
|
@@ -421,7 +438,7 @@ module Concurrent
|
|
421
438
|
# @!visibility private
|
422
439
|
def realize(task)
|
423
440
|
@executor.post do
|
424
|
-
success, value, reason = SafeTaskExecutor.new(task).execute
|
441
|
+
success, value, reason = SafeTaskExecutor.new(task).execute(*@args)
|
425
442
|
|
426
443
|
children_to_notify = mutex.synchronize do
|
427
444
|
set_state!(success, value, reason)
|
@@ -432,11 +449,13 @@ module Concurrent
|
|
432
449
|
end
|
433
450
|
end
|
434
451
|
|
452
|
+
# @!visibility private
|
435
453
|
def set_state!(success, value, reason)
|
436
454
|
set_state(success, value, reason)
|
437
455
|
event.set
|
438
456
|
end
|
439
457
|
|
458
|
+
# @!visibility private
|
440
459
|
def synchronized_set_state!(success, value, reason)
|
441
460
|
mutex.lock
|
442
461
|
set_state!(success, value, reason)
|
data/lib/concurrent/version.rb
CHANGED
data/lib/concurrent_ruby_ext.jar
CHANGED
Binary file
|
data/lib/extension_helper.rb
CHANGED
@@ -1,28 +1,37 @@
|
|
1
1
|
module Concurrent
|
2
2
|
|
3
|
+
@@c_ext_loaded ||= false
|
4
|
+
@@java_ext_loaded ||= false
|
5
|
+
|
3
6
|
# @!visibility private
|
4
7
|
def self.allow_c_extensions?
|
5
8
|
defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby'
|
6
9
|
end
|
7
10
|
|
8
11
|
# @!visibility private
|
9
|
-
def self.
|
10
|
-
|
11
|
-
rescue
|
12
|
-
false
|
12
|
+
def self.jruby?
|
13
|
+
RUBY_PLATFORM == 'java'
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
if allow_c_extensions? && !@@c_ext_loaded
|
17
|
+
begin
|
18
|
+
require 'concurrent/extension'
|
19
|
+
@@c_ext_loaded = true
|
20
|
+
rescue LoadError
|
21
|
+
# may be a Windows cross-compiled native gem
|
22
|
+
begin
|
23
|
+
require "concurrent/#{RUBY_VERSION[0..2]}/extension"
|
24
|
+
@@c_ext_loaded = true
|
25
|
+
rescue LoadError
|
26
|
+
warn 'Performance on MRI may be improved with the concurrent-ruby-ext gem. Please see http://concurrent-ruby.com'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
elsif jruby? && !@@java_ext_loaded
|
30
|
+
begin
|
31
|
+
require 'concurrent_ruby_ext'
|
32
|
+
@@java_ext_loaded = true
|
33
|
+
rescue LoadError
|
34
|
+
warn 'Performance on JRuby may be improved by installing the pre-compiled Java extensions. Please see http://concurrent-ruby.com'
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concurrent-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.0
|
6
5
|
platform: java
|
7
6
|
authors:
|
8
7
|
- Jerry D'Antonio
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-25 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: |2
|
15
14
|
Modern concurrency tools including agents, futures, promises, thread pools, actors, supervisors, and more.
|
@@ -22,51 +21,12 @@ extra_rdoc_files:
|
|
22
21
|
- LICENSE.txt
|
23
22
|
- CHANGELOG.md
|
24
23
|
files:
|
24
|
+
- CHANGELOG.md
|
25
|
+
- LICENSE.txt
|
26
|
+
- README.md
|
25
27
|
- lib/concurrent.rb
|
26
|
-
- lib/concurrent_ruby.rb
|
27
|
-
- lib/concurrent_ruby_ext.so
|
28
|
-
- lib/extension_helper.rb
|
29
28
|
- lib/concurrent/actor.rb
|
30
|
-
- lib/concurrent/actress.rb
|
31
|
-
- lib/concurrent/agent.rb
|
32
|
-
- lib/concurrent/async.rb
|
33
|
-
- lib/concurrent/atomic.rb
|
34
|
-
- lib/concurrent/atomics.rb
|
35
|
-
- lib/concurrent/channels.rb
|
36
|
-
- lib/concurrent/collections.rb
|
37
|
-
- lib/concurrent/configuration.rb
|
38
|
-
- lib/concurrent/dataflow.rb
|
39
|
-
- lib/concurrent/delay.rb
|
40
|
-
- lib/concurrent/dereferenceable.rb
|
41
|
-
- lib/concurrent/errors.rb
|
42
|
-
- lib/concurrent/exchanger.rb
|
43
|
-
- lib/concurrent/executors.rb
|
44
|
-
- lib/concurrent/future.rb
|
45
|
-
- lib/concurrent/ivar.rb
|
46
|
-
- lib/concurrent/lazy_register.rb
|
47
|
-
- lib/concurrent/logging.rb
|
48
|
-
- lib/concurrent/mvar.rb
|
49
|
-
- lib/concurrent/obligation.rb
|
50
|
-
- lib/concurrent/observable.rb
|
51
|
-
- lib/concurrent/options_parser.rb
|
52
|
-
- lib/concurrent/promise.rb
|
53
|
-
- lib/concurrent/scheduled_task.rb
|
54
|
-
- lib/concurrent/timer_task.rb
|
55
|
-
- lib/concurrent/tvar.rb
|
56
|
-
- lib/concurrent/utilities.rb
|
57
|
-
- lib/concurrent/version.rb
|
58
29
|
- lib/concurrent/actor/behaviour.rb
|
59
|
-
- lib/concurrent/actor/context.rb
|
60
|
-
- lib/concurrent/actor/core.rb
|
61
|
-
- lib/concurrent/actor/default_dead_letter_handler.rb
|
62
|
-
- lib/concurrent/actor/envelope.rb
|
63
|
-
- lib/concurrent/actor/errors.rb
|
64
|
-
- lib/concurrent/actor/internal_delegations.rb
|
65
|
-
- lib/concurrent/actor/public_delegations.rb
|
66
|
-
- lib/concurrent/actor/reference.rb
|
67
|
-
- lib/concurrent/actor/root.rb
|
68
|
-
- lib/concurrent/actor/type_check.rb
|
69
|
-
- lib/concurrent/actor/utils.rb
|
70
30
|
- lib/concurrent/actor/behaviour/abstract.rb
|
71
31
|
- lib/concurrent/actor/behaviour/awaits.rb
|
72
32
|
- lib/concurrent/actor/behaviour/buffer.rb
|
@@ -80,10 +40,25 @@ files:
|
|
80
40
|
- lib/concurrent/actor/behaviour/supervising.rb
|
81
41
|
- lib/concurrent/actor/behaviour/terminates_children.rb
|
82
42
|
- lib/concurrent/actor/behaviour/termination.rb
|
43
|
+
- lib/concurrent/actor/context.rb
|
44
|
+
- lib/concurrent/actor/core.rb
|
45
|
+
- lib/concurrent/actor/default_dead_letter_handler.rb
|
46
|
+
- lib/concurrent/actor/envelope.rb
|
47
|
+
- lib/concurrent/actor/errors.rb
|
48
|
+
- lib/concurrent/actor/internal_delegations.rb
|
49
|
+
- lib/concurrent/actor/public_delegations.rb
|
50
|
+
- lib/concurrent/actor/reference.rb
|
51
|
+
- lib/concurrent/actor/root.rb
|
52
|
+
- lib/concurrent/actor/type_check.rb
|
53
|
+
- lib/concurrent/actor/utils.rb
|
83
54
|
- lib/concurrent/actor/utils/ad_hoc.rb
|
84
55
|
- lib/concurrent/actor/utils/balancer.rb
|
85
56
|
- lib/concurrent/actor/utils/broadcast.rb
|
86
57
|
- lib/concurrent/actor/utils/pool.rb
|
58
|
+
- lib/concurrent/actress.rb
|
59
|
+
- lib/concurrent/agent.rb
|
60
|
+
- lib/concurrent/async.rb
|
61
|
+
- lib/concurrent/atomic.rb
|
87
62
|
- lib/concurrent/atomic/atomic_boolean.rb
|
88
63
|
- lib/concurrent/atomic/atomic_fixnum.rb
|
89
64
|
- lib/concurrent/atomic/condition.rb
|
@@ -102,13 +77,22 @@ files:
|
|
102
77
|
- lib/concurrent/atomic_reference/numeric_cas_wrapper.rb
|
103
78
|
- lib/concurrent/atomic_reference/rbx.rb
|
104
79
|
- lib/concurrent/atomic_reference/ruby.rb
|
80
|
+
- lib/concurrent/atomics.rb
|
105
81
|
- lib/concurrent/channel/buffered_channel.rb
|
106
82
|
- lib/concurrent/channel/channel.rb
|
107
83
|
- lib/concurrent/channel/unbuffered_channel.rb
|
108
84
|
- lib/concurrent/channel/waitable_list.rb
|
85
|
+
- lib/concurrent/channels.rb
|
109
86
|
- lib/concurrent/collection/blocking_ring_buffer.rb
|
110
87
|
- lib/concurrent/collection/priority_queue.rb
|
111
88
|
- lib/concurrent/collection/ring_buffer.rb
|
89
|
+
- lib/concurrent/collections.rb
|
90
|
+
- lib/concurrent/configuration.rb
|
91
|
+
- lib/concurrent/dataflow.rb
|
92
|
+
- lib/concurrent/delay.rb
|
93
|
+
- lib/concurrent/dereferenceable.rb
|
94
|
+
- lib/concurrent/errors.rb
|
95
|
+
- lib/concurrent/exchanger.rb
|
112
96
|
- lib/concurrent/executor/cached_thread_pool.rb
|
113
97
|
- lib/concurrent/executor/executor.rb
|
114
98
|
- lib/concurrent/executor/fixed_thread_pool.rb
|
@@ -129,16 +113,31 @@ files:
|
|
129
113
|
- lib/concurrent/executor/single_thread_executor.rb
|
130
114
|
- lib/concurrent/executor/thread_pool_executor.rb
|
131
115
|
- lib/concurrent/executor/timer_set.rb
|
116
|
+
- lib/concurrent/executors.rb
|
117
|
+
- lib/concurrent/future.rb
|
118
|
+
- lib/concurrent/ivar.rb
|
119
|
+
- lib/concurrent/lazy_register.rb
|
120
|
+
- lib/concurrent/logging.rb
|
121
|
+
- lib/concurrent/mvar.rb
|
122
|
+
- lib/concurrent/obligation.rb
|
123
|
+
- lib/concurrent/observable.rb
|
124
|
+
- lib/concurrent/options_parser.rb
|
125
|
+
- lib/concurrent/promise.rb
|
126
|
+
- lib/concurrent/scheduled_task.rb
|
127
|
+
- lib/concurrent/timer_task.rb
|
128
|
+
- lib/concurrent/tvar.rb
|
129
|
+
- lib/concurrent/utilities.rb
|
132
130
|
- lib/concurrent/utility/processor_count.rb
|
133
131
|
- lib/concurrent/utility/timeout.rb
|
134
132
|
- lib/concurrent/utility/timer.rb
|
135
|
-
-
|
136
|
-
-
|
137
|
-
- CHANGELOG.md
|
133
|
+
- lib/concurrent/version.rb
|
134
|
+
- lib/concurrent_ruby.rb
|
138
135
|
- lib/concurrent_ruby_ext.jar
|
136
|
+
- lib/extension_helper.rb
|
139
137
|
homepage: http://www.concurrent-ruby.com
|
140
138
|
licenses:
|
141
139
|
- MIT
|
140
|
+
metadata: {}
|
142
141
|
post_install_message:
|
143
142
|
rdoc_options: []
|
144
143
|
require_paths:
|
@@ -148,20 +147,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
147
|
- - '>='
|
149
148
|
- !ruby/object:Gem::Version
|
150
149
|
version: 1.9.3
|
151
|
-
none: false
|
152
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
151
|
requirements:
|
154
152
|
- - '>='
|
155
153
|
- !ruby/object:Gem::Version
|
156
154
|
version: '0'
|
157
|
-
hash: 2
|
158
|
-
segments:
|
159
|
-
- 0
|
160
|
-
none: false
|
161
155
|
requirements: []
|
162
156
|
rubyforge_project:
|
163
|
-
rubygems_version:
|
157
|
+
rubygems_version: 2.4.5
|
164
158
|
signing_key:
|
165
|
-
specification_version:
|
159
|
+
specification_version: 4
|
166
160
|
summary: Modern concurrency tools for Ruby. Inspired by Erlang, Clojure, Scala, Haskell, F#, C#, Java, and classic concurrency patterns.
|
167
161
|
test_files: []
|
data/lib/concurrent_ruby_ext.so
DELETED
Binary file
|